Debian:USB-Debianをフルバックアップ
USBにDebianをインストールしてあると、持ち運びがしやすくて便利だが、いつかはUSBの読み書き限界に突き当たるので、OSフルバックアップをしておこうと思う。
また、OSアップグレードの際には大量の読み書きが発生するので、一旦外付けHDDにバックアップして、そちらでOSアップグレード。その後新しいUSBに移す。ということが出来ると安心。
目次
cp コマンドじゃできなかった。UUID がない?
cp -r して作ったバックアップUSBでブートしようとしたら、grub でエラー。
error: no such device : /media/68dc4f68-hogehoge. grub rescue>
この、/media/68dc4f68-hogehoge とはなんぞやと調べると、これは UUID というものらしい。
UUID
UUID【Universally Unique IDentifier】 全世界で2 つ以上のアイテムが同じ値を持つことがない一意な識別子
LinuxでUSB外付けディスクをつないでマウントしようとするとき、各デバイスが/devディレクトリにマップされる。Debianをはじめとして、最近のLinuxディストリビューションで採用されているカーネルでは、接続されているディスクを、接続順や接続環境に依らずに一意に判別する手段の一つとして、このUUIDが使われる。 具体的には /dev/disk/ 以下にID,Label,Path,UUIDの4種類からデバイスマップを取得できる。
$ ls /dev/disk/
by-id by-label by-path by-uuid
それぞれのディレクトリには各ディスクやパーティーションのデバイスファイルにシンボリックリンクが張られており、ディスクが持つ固有情報をキーとして利用し、マウントに活用することができる。マウントされたデバイスのUUIDを調べてみる。
$ sudo dmesg | tail -n 30
[ 4159.492037] usb 1-2.3: new high-speed USB device number 10 using ehci_hcd
[ 4159.618667] usb 1-2.3: New USB device found, idVendor=056e, idProduct=6049
:
:
[ 1121.455517] scsi 3:0:0:0: Direct-Access JetFlash Transcend 32GB 1100 PQ: 0 ANSI: 6
:
:
[ 1121.942521] EXT4-fs (sdd2): mounted filesystem with ordered data mode. Opts: (null)
$ ls -al /dev/disk/by-uuid/ | grep sdd2
lrwxrwxrwx 1 root root 10 2008-11-15 16:34 3B69-1AFD -> ../../sdd2
blkid コマンドでもUUIDを確認できる。
$ sudo blkid
/dev/sdb1: UUID="hoge" TYPE="vfat" PARTUUID="hogehoge"
/dev/sdb2: UUID="fuga" TYPE="ext4" PARTUUID="fugafuga"
dd で UUID も含めてコピー
ddでハードディスク全体のクローンをするとUUIDもコピーされる。
コピー先の新しいUSBを準備
USBを挿す
$ sudo dmesg | tail -20 # 認識場所を見つける。/dev/sdf1 だったとして、
$ df # マウントされてるか確認
$ sudo umount /dev/sdf1 # マウントされてたら解除
USBのフォーマット作業はいらない。
dd の使い方
物理ディスク /dev/sdX を物理ディスク /dev/sdY に複製:
# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progressこのコマンドは MBR (とブートローダー)、全てのパーティション、UUID、データを含めディスクの全てを複製します。
noerror は読み取りエラーを全て無視して操作を続行します。dd のデフォルトの挙動ではエラーがあると dd は動作を停止します。
sync は読み取りエラーが存在した場合、入力ブロックをゼロで埋めるため、データのオフセットも同期します。
status=progress は定期的に転送の統計を表示して、操作が完了するまでの時間を見積もることができます。
入力ファイル (if=) と出力ファイル (of=) の順序に注意し、逆にしないように!必ずコピー先ドライブまたはパーティション (of=) のサイズがコピー元 (if=) のサイズ以上になっているようにしてください。
bs=はブロックサイズをセットします。デフォルトはハードドライブの「古典的な」ブロックサイズである 512 バイトですが、64K や 128K など大きな値を使ったほうが最近の事情には即しています。自分のディスクにエラーがないと自信を持てるなら、ブロックサイズを大きくしてもよいでしょう。
bs: ブロックサイズ でかい方が速い キャッシュ容量内で指定。
/dev/sdX1 は、ディスク/dev/sdX のパーテーション1 ということ。ディスク全体なら、1 のない /dev/sdX を使う。
$ sudo blkid #UUIDを確認
バックアップしたいUSBが /dev/sde、 バックアップ先USBが /dev/sdd だったとして、
$ sudo dd if=/dev/sde of=/dev/sdd bs=1M conv=noerror,sync status=progress && sudo sync
syncコマンド メモリに残っているものをディスクに書き込む。念のため。シャットダウンするのなら勝手にやってくれてる。
元ディスクと バックアップ先のUSBが、違うサイズの場合
dd でサイズ指定のファイル作成って出来ないの?
dd bs=バイト数 count=個数 で、「バイト数×個数」分のサイズのファイルを作成するということになっている。例えば100バイトのファイルは、
$ sudo dd bs=100 count=1 if=file1 of=file2
102400バイトのファイルは、
$ sudo dd bs=1K count=100 if=file1 of=file2
100000バイトのファイルは、
$ sudo dd bs=1KB count=100 if=file1 of=file2
そこで次のように31.7Gまでコピーしてくれるかと思ったら、できなかった。
$ sudo dd if=/dev/sde of=/dev/sdd bs=1M count=31700 conv=noerror,sync status=progress && sudo sync
書き込み先の容量が足らんといって、エラー終了する。
マウントされていないパーティション情報を表示する
$ sudo parted -l
GPT header の書き換え
gdisk でパーテーション構成を確認
元ディスク(HDD 60GB)
$ sudo gdisk /dev/sde
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 1048575 511.0 MiB EF00
2 1048576 61700095 28.9 GiB 8300
新ディスク(USB 32GB)
$ sudo gdisk /dev/sdd
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: damaged
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 1048575 511.0 MiB EF00
2 1048576 61700095 28.9 GiB 8300
ddコマンドで、パーテーション構成やデータのコピーはできてることが分かる。
GPT の backup header が 60GB のディスク容量を指し示しているのが問題だった。パーティション構成や、データも問題ない。
gdisk で続けて作業。
Command (? for help): ?
r recovery and transformation options (experts only)
Command (? for help): r
Recovery/transformation command (? for help): ?
e load main partition table from disk (rebuilding backup)
w write table to disk and exit
Recovery/transformation command (? for help): e
Warning! This will probably do weird things if you've converted an MBR to
GPT form and haven't yet saved the GPT! Proceed? (Y/N): Y
Recovery/transformation command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdd.
The operation has completed successfully.
一度電源を切って、修復したUSBでOSブート。 無事にブートに成功。dd 以前の最新データも問題なく存在していた。
やれやれ