kobapan@wiLiki
Login
Debian

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 など大きな値を使ったほうが最近の事情には即しています。自分のディスクにエラーがないと自信を持てるなら、ブロックサイズを大きくしてもよいでしょう。

ハードディスク全体のクローン | ArchWiki

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 以前の最新データも問題なく存在していた。

やれやれ

参考

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...