Debian化したnasneのHDDが壊れたので、元の構成に戻した

この記事は約10分で読めます。

Debian化して使っていたnasne(CECH-ZNR2J)の内蔵HDDが突然壊れました😢まあ、nasneはずっと使ってなかったので、急にしばいたことで心筋梗塞を起こしたのかと。

SIE製nasneをDebian化して使い続ける
はじめに ほとんど使っていないSIE製nasne(CECH-ZNR2J)ですが、2027年7月には使い物にならなくなってしまう。 たまたま、Xで以下のリポジトリの情報が流れてきた。どうもnasneを普通のDebian Linuxサーバーとし…

新しいHDDに交換し、「純正の構造を持つHDD+その中にDebianのイメージ」という元の構成に戻すまでの手順をまとめます。

Debian化には SonyNasne-debian を使っています。nasneはチューナー専用にして、Synology NAS上のMirakurun/EPGStationから使う構成です。作業はWindows 11のWSL2(Ubuntu)で行いました。

注意:自己責任でお願いします。新しいHDDの中身はすべて消え、元のHDDの録画データも戻りません。また、事前にdevian化した際の成果物などを使ってます。何もない状態からの復旧手順ではないので、その点は承知おきくだしあ。

症状

  • テレビが見られなくなり、Mirakurunが「チューナー起動」のまま進まない
  • nasneにpingが通らない(Destination Host Unreachable)。ルーターのDHCPの予約は正しい
  • 前面のランプが全部点滅し、電源を入れ直しても変わらない

リポジトリの資料によると、Debian直起動のカーネルは「録画領域(p3)のDebianを起動 → 失敗したらSonyの起動処理に戻る」という流れで、そこも失敗するとランプが点滅したまま止まります。両方とも失敗しているので、HDDそのものが読めないと判断しました。

原因の切り分け

HDDを取り出してUSB-SATA変換アダプタでPCにつなぐと、接続音は鳴るものの、ディスクの管理にもデバイスマネージャーにも出てきません。HDDは「ウーン」と回転しているので、回転はするがデータに応答しない故障(基板やファームウェア)と判断。以前同じアダプタで読めていたので、アダプタは正常なハズ。

方針

リポジトリには、空のHDDから純正の状態に戻す手順(docs/04_hdd_recovery_guide.md)があります。ただし、録画領域は古い形式のXFS(V4、CRCなし)で、最近のカーネルではマウントできません。WSL2でも Deprecated V4 format (crc=0) not supported by kernel と言われて弾かれます。

そこで、次のように分担しました。

  • XFSの作成はWSLで行う(作るだけならマウント不要)
  • XFSへの書き込みが必要な処理(純正の初期構造を作る p3init)は、WSLでは空のフォルダに作っておき、Debianが起動した後にnasne自身に録画領域へコピーさせる(nasneのカーネルは古い形式のXFSを扱える)
  • 純正アプリが照合するHDDのシリアルは、nasne本体から読む(理由は後述)

準備するもの

  • 2.5インチのSATA HDD(厚さ9.5mm以下)。今回は WD5000LPCX(500GB)を使用
  • USB-SATA変換アダプタ
  • 最初にDebian化したときのバックアップとビルド成果物(build_nasne/ など)
  • WSLに parted(partprobe に必要)。シリアル確認用に smartmontools も入れましたが、WSLでは使えませんでした

1. HDDをWSLに渡す

PowerShell(管理者)でディスクの番号を確認します。

Get-CimInstance -Query "SELECT * from Win32_DiskDrive" | Select-Object DeviceID, Model, Size

新しいHDDにWindowsの区画が作られていたため、wsl --mount が「ディスクは使用中」(0x8007006c)で失敗。Windows側でオフラインにしてから渡す必要があります。

Get-Disk -Number 5 | Format-List Number, FriendlyName, Size, IsOffline
Set-Disk -Number 5 -IsOffline $true
wsl --mount \\.\PHYSICALDRIVE5 --bare

2. 区画を作る

cd ~/SonyNasne-debian
git pull
lsblk -o NAME,SIZE,MODEL,SERIAL
sudo python3 scripts/nasne_hdd_rebuild.py mkdisk /dev/sdX --serial <lsblkで見えたシリアル>

sys1(256MB、ext3)・sys2(1GB、ext3)・user(残り、XFS)の3区画ができます。partprobe が無いとファイルシステムを作る前に止まるので、先に sudo apt install parted しておきます。

XFSが古い形式で作られたかは、マウントせずに確認できます。

sudo blkid /dev/sdX3
sudo xfs_db -r -c version /dev/sdX3    # V4 で、CRC が含まれていなければOK

3. 本体の個体IDを書かせる

sudo mount /dev/sdX1 /mnt/nasne_sys1 && findmnt /mnt/nasne_sys1
sudo python3 scripts/nasne_hdd_rebuild.py phase1 build_nasne/KRST3101_0260_SECURE.dlm /mnt/nasne_sys1
sync && sudo umount /mnt/nasne_sys1

HDDをnasneに入れて電源を入れ、2〜3分待ってから切ります。SPIにDebian用のカーネルが入っていても、録画領域にDebianが無いとSonyの起動処理に切り替わるので、そこで個体IDが書き込まれます。PCに戻して読み出します。

sudo mount /dev/sdX1 /mnt/nasne_sys1
sudo python3 scripts/nasne_hdd_rebuild.py read-id /mnt/nasne_sys1
# 個体ID: xxxxxxxxxxxxxxxx

4. 純正の構造を作る

ID=xxxxxxxxxxxxxxxx
sudo python3 scripts/nasne_hdd_rebuild.py final build_nasne/KRST3101_0260_SECURE.dlm /mnt/nasne_sys1 --chipid $ID
sudo python3 scripts/nasne_hdd_rebuild.py verify /mnt/nasne_sys1     # 結果: OK
cp /mnt/nasne_sys1/00550066.dlm backup/00550066.dlm.new-hdd

録画領域の初期構造は、空のフォルダに作ってtarにまとめておきます(マウントされていない場所への書き込みなので --allow-unmounted を付けます)。

mkdir ~/p3stage
sudo python3 scripts/nasne_hdd_rebuild.py --allow-unmounted p3init ~/p3stage --chipid $ID --device /dev/sdX
sudo tar --numeric-owner -cpf ~/p3init.tar -C ~/p3stage .

5. Debian入りの .dlm を作って入れる

最初の導入と同じです。--hdd-dlm には、新しいHDD用に作った純正の 00550066.dlm を渡します。

python3 scripts/nasne_setup.py build --download-official \
  --hdd-dlm backup/00550066.dlm.new-hdd --ssh-pubkey ~/.ssh/nasne_rsa.pub \
  --work build_nasne --telnet fail < /dev/null 2>&1 | tee build.log
sudo bash scripts/stage1/install_dlm.sh /mnt/nasne_sys1 build_nasne/custom_00550066.dlm --backup-dir ./backup_sys1_newhdd
sync && sudo umount /mnt/nasne_sys1

HDDをnasneに入れて電源を入れ、5分ほど待ちます。SPIのカーネルはすでに書き込み済みなので、ログには「SPIのKNLはすでに目的のカーネル。何もしない」と出て、書き換えは行われません。

6. HDDのシリアルを本体で読み、初期構造を入れる

純正アプリは、録画領域の登録情報(.hai)に書かれたシリアルと、本体から見たHDDのシリアルを照合します。ところが、USB変換アダプタ越しにWSLで見えたシリアルは、本体から見たものとまったく別の文字列でした。WSLでは smartctl もHDDに届きません。そこで、Debianが起動した後にnasne本体で読みます。

ssh root@<nasneのIP> 'hdparm -I /dev/sda | grep -E "Model Number|Serial Number"'
#   Model Number:  WDC WD5000LPCX-16VHAT2
#   Serial Number: WD-WXxxxxxxxxxx

このシリアルで .hai を作り直し、nasneの録画領域(Debianからは /data)に展開します。

sudo python3 scripts/nasne_hai.py gen ~/p3stage --chipid $ID --vendor ATA --model "WDC WD5000LPCX-1" --serial "WD-WXxxxxxxxxxx"
sudo python3 scripts/nasne_hai.py show ~/p3stage/00000000.hai ~/p3stage/00000001.hai   # 検査和 OK を確認
sudo tar --numeric-owner -cpf ~/p3init.tar -C ~/p3stage .
cat ~/p3init.tar | ssh root@<nasneのIP> 'tar --no-overwrite-dir -xpf - -C /data && sync && ls -la /data'

/data に 00000000.hai・00000001.hai・00000015・00000021・opt・setup・share と、Debianのイメージが入った .nasne-debian が並べば完成です。

(sshはnasneの古いsshdに合わせて、実際には -i ~/.ssh/nasne_rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa を付けています。)

7. 仕上げ

curl -s http://<nasneのIP>:8301/status で idle(Mirakurunが動いていれば busy)が返れば、Mirakurunからそのまま使えます。テレビ局の登録情報はNAS側に残っているので、チャンネル検出のやり直しはありません。

ハマりどころ

症状原因対処
wsl --mount が「ディスクは使用中」(0x8007006c)WindowsがHDDの区画をドライブとして開いているSet-Disk -Number N -IsOffline $true してから渡す
mkdisk が partprobe で止まるparted が入っていないsudo apt install parted して再実行
WSLでXFSがマウントできない最近のカーネルはXFS V4に非対応書き込みはnasne自身に任せる
mount が固まり、Ctrl+Cも効かない。dmesgに hv_storvsc ... host 0xc0000001 が大量に出るUSBを抜き差しした後、WSLが古い接続を使い続けているwsl --shutdown → USBを挿し直す → wsl --mount し直す
WSLを再起動したら /dev/sde1 does not existディスクの名前が sdd に変わり、sde はWSL自身のディスクになっていた毎回 lsblk で名前を確認する(書き込み先を間違えると致命的)
WSLで見えるシリアルと、本体から見たシリアルが違うUSB変換アダプタがシリアルを崩して伝えている本体の hdparm -I で読んだ値で .hai を作る
起動後5分たってもpingが通らないLANケーブルの挿し忘れ挿してから、電源を入れ直す。待ってても再接続はされないので、起動時にLANが挿されている状態である必要がある。

まとめ

HDDが壊れても、SPIのバックアップと最初のビルド成果物が残っていれば、純正の構造ごと元に戻せました。ポイントは、「XFSへの書き込みはnasneにやらせる」「HDDのシリアルはnasne本体で読む」の2つです。次に壊れたときのために、新しい個体IDと、新しいHDD用の 00550066.dlm も控えておくといいかと。

参考

  • SonyNasne-debian(GitHub)
  • 同リポジトリの docs/04_hdd_recovery_guide.md(HDDの復旧)、docs/13_full_setup_from_official_hdd.md(Debianの導入)、docs/15_p3_structure_and_hai.md(録画領域と .hai)

コメント