■debian wheezyのUSB起動インストーラの作成 対象のPCは、Legacy-BIOS、セキュアブート無効で、USB起動を優先に変更しておくこと。 対象のPCの外部記憶ディスクは極力外しておき、内蔵ディスクに書き込まないよう気をつける。 USBメモリのパーティションテーブルは、GPTを使わずにMBRで作成すること。 ■インストーラは以下を準備。 $ URL="http://cdimage.debian.org/debian-cd"; \ VER="7.3.0"; \ ARCH="amd64"; \ TYPE="netinst"; \ wget "${URL}/${VER}/${ARCH}/iso-cd/debian-${VER}-${ARCH}-${TYPE}.iso" $ URL="http://cdimage.debian.org/debian-cd"; \ VER="7.3.0"; \ ARCH="amd64"; \ TYPE="netinst"; \ w3m -dump "${URL}/${VER}/${ARCH}/iso-cd/MD5SUMS" | \ grep "debian-${VER}-${ARCH}-${TYPE}.iso" 72473e8a5e65b61acc7efde90d9f71d1 debian-7.3.0-amd64-netinst.iso $ URL="http://cdimage.debian.org/debian-cd"; \ VER="7.3.0"; \ ARCH="amd64"; \ TYPE="netinst"; \ w3m -dump "${URL}/${VER}/${ARCH}/iso-cd/SHA1SUMS" | \ grep "debian-${VER}-${ARCH}-${TYPE}.iso" 545f2c5ce99d64ec169156436fe596a580cb6047 debian-7.3.0-amd64-netinst.iso ■内蔵ディスクのsdaを除いて検索。 sdb、sdc ... sdzまで。 sdbが今回使用する16GBのUSBメモリ。 $ mount | grep sd[b-z] $ dmesg | grep "sd [0-9]\:.*\[sd" | grep -v sda [79968.900916] sd 7:0:0:0: [sdb] 31506432 512-byte logical blocks: (16.1 GB/15.0 GiB) [79968.901310] sd 7:0:0:0: [sdb] Write Protect is off [79968.901320] sd 7:0:0:0: [sdb] Mode Sense: 23 00 00 00 [79968.901683] sd 7:0:0:0: [sdb] No Caching mode page present [79968.901690] sd 7:0:0:0: [sdb] Assuming drive cache: write through [79968.904069] sd 7:0:0:0: [sdb] No Caching mode page present [79968.904076] sd 7:0:0:0: [sdb] Assuming drive cache: write through [79969.877780] sd 7:0:0:0: [sdb] No Caching mode page present [79969.877793] sd 7:0:0:0: [sdb] Assuming drive cache: write through [79969.877803] sd 7:0:0:0: [sdb] Attached SCSI removable disk ■fdiskでパーティションを確認する。 ※GPT(GUI Parttion Table)だと上手く表示されないが、 GPTパーティションでも削除は出来る。 $ sudo fdisk -l /dev/sdb Disk /dev/sdb: 16.1 GB, 16131293184 bytes 255 heads, 63 sectors/track, 1961 cylinders, total 31506432 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0000d68a Device Boot Start End Blocks Id System /dev/sdb1 * 2048 30124031 15060992 83 Linux /dev/sdb2 30126078 31504383 689153 5 Extended /dev/sdb5 30126080 31504383 689152 82 Linux swap / Solaris ■上記は以下でマルチブートを設定した時のUSBメモリ。 7/2にマルチブート設定して、7/7に無線LANが動作することを確認して、 役目を果たしたのですね。 ネットノートを購入。USB起動でWheezyインストーラを起動【下調べ編】 http://d.hatena.ne.jp/labunix/20130628 USB起動メディア(x2)でWindows8(HDD)と即席マルチブート http://d.hatena.ne.jp/labunix/20130703 Wheezyに無線LANドライバを導入する。 http://d.hatena.ne.jp/labunix/20130707 $ sudo mount -o loop /dev/sdb1 /media/usb0/ $ cat /media/usb0/etc/debian_version 7.1 $ grep "status.*base-files" /media/usb0/var/log/dpkg.log | \ awk -F\: '{print $4}' | sort -u amd64 7.1wheezy1 $ sudo umount /dev/sdb1 ■awkで最初の行と最終行を取り出す。 ※「head -n 1」と「tail -n 1」の2回コマンドを打っても良い。 $ awk '(NR==1){print};END {print $0;}' /media/usb0/var/log/dpkg.log 2013-07-02 15:37:32 startup archives install 2013-07-07 19:27:16 status installed man-db:amd64 2.6.2-1 ■fdiskで1パーティションに初期化、再読み込み。 syncして、ejectを発行して抜き差ししているが、 システムの再起動の方が確実。 $ sudo fdisk /dev/sdb Command (m for help): d Partition number (1-5): 5 Command (m for help): d Partition number (1-5): 2 Command (m for help): d Selected partition 1 Command (m for help): p Device Boot Start End Blocks Id System Command (m for help): n Select (default p): p Partition number (1-4, default 1): 1 $ su root -c 'sync;sync;sync' $ sudo eject /dev/sdb && echo "USBメモリの抜き差し" USBメモリの抜き差し $ sudo tail -20 /var/log/messages | cut -c 29- | \ grep "connect\|Attach\|found" kernel: [89781.589140] usb 3-2: USB disconnect, device number 16 kernel: [89808.828966] usb 3-2: New USB device found, idVendor=054c, idProduct=0243 kernel: [89809.836329] sd 15:0:0:0: Attached scsi generic sg11 type 0 kernel: [89810.832018] sd 15:0:0:0: [sdb] Attached SCSI removable disk $ sudo fdisk -l /dev/sdb | tail -2 Device Boot Start End Blocks Id System /dev/sdb1 2048 31506431 15752192 83 Linux ■MBRにisolinux.binの文字列があること。 $ dd if=debian-7.3.0-amd64-netinst.iso bs=512 count=1 2>/dev/null | \ hexdump -C | grep iso 000000b0 00 e8 83 00 69 73 6f 6c 69 6e 75 78 2e 62 69 6e |....isolinux.bin| ■ディスクの起動フラグ「boot signature 0xAA55」があること。 $ dd if=debian-7.3.0-amd64-netinst.iso bs=2 skip=255 count=1 2>/dev/null | \ od -tx1 0000000 55 aa 0000002 ■パーティションの起動フラグ「Active Partition 0x80」があること。 「0x00」は、もしかして2つ目のパーティションがある? $ dd if=debian-7.3.0-amd64-netinst.iso bs=2 skip=223 count=32 count=1 2>/dev/null | \ od -tx1 0000000 80 00 0000002 ■Active Partitionは、「Device Boot」で「*」になるところ。 2つパーティションがあった。 $ sudo fdisk -l debian-7.3.0-amd64-netinst.iso 2>/dev/null | tail -3 Device Boot Start End Blocks Id System debian-7.3.0-amd64-netinst.iso1 * 0 452607 226304 0 Empty debian-7.3.0-amd64-netinst.iso2 134792 135687 448 ef EFI (FAT-12/16/32) ■では間違えないように書き込みましょう。 $ dmesg | grep sd | tail -1; \ mount | grep "sd[b-z]" || echo "no mount"; \ sudo fdisk -l /dev/sdb 2>&1 | tail -2 [89810.832018] sd 15:0:0:0: [sdb] Attached SCSI removable disk no mount Device Boot Start End Blocks Id System /dev/sdb1 2048 31506431 15752192 83 Linux $ stat -c "%B" debian-7.3.0-amd64-netinst.iso | sed s/^/"Block Size="/ Block Size=512 $ stat -c "%B" /dev/sdb | sed s/^/"Block Size="/ Block Size=512 $ sudo dd if=debian-7.3.0-amd64-netinst.iso of=/dev/sdb bs=512 452608+0 レコード入力 452608+0 レコード出力 231735296 バイト (232 MB) コピーされました、 68.1855 秒、 3.4 MB/秒 $ sudo fdisk -l /dev/sdb 2>&1 | tail -3 Device Boot Start End Blocks Id System /dev/sdb1 * 0 452607 226304 0 Empty /dev/sdb2 134792 135687 448 ef EFI (FAT-12/16/32) ■ハッシュで確認する。 ddはレコード入出力の値を参照。 別に標準入力で受け取らないといけないというルールは無いw。 $ dd if=/dev/sdb bs=512 count=452608 2>/dev/null | md5sum 72473e8a5e65b61acc7efde90d9f71d1 - $ cat debian-7.3.0-amd64-netinst.iso | md5sum 72473e8a5e65b61acc7efde90d9f71d1 - ■SHA1のハッシュで確認。 $ dd if=/dev/sdb bs=512 count=452608 2>/dev/null | openssl dgst -sha1 (stdin)= 545f2c5ce99d64ec169156436fe596a580cb6047 $ cat debian-7.3.0-amd64-netinst.iso | openssl dgst -sha1 (stdin)= 545f2c5ce99d64ec169156436fe596a580cb6047 ■後はいつものように。。。 ■余談。 やっぱりUSB起動メディアにswapファイルシステムは作らない方が良い。 ISOイメージを複数書き込んで、極力読み取り専用にしようとしていた 2年前の自分も言ってた。 ---抜粋--- ※USBでISOという特殊な環境の為、LVMやジャーナリングは使いませんし、 swapも作りません。 どうしてもswapしたい時は、ファイルで対応します。 --- debian i386/amd64 Lenny/Squeeze USB起動インストーラ http://d.hatena.ne.jp/labunix/20111002 ■不良セクタが見つかった場合の対処方法 参考:不良セクタの検査と登録 http://hp.vector.co.jp/authors/VA008536/libretto/badblocks.html ■ところで約6ヶ月放置したことで、以下のようなエラーを確認した。 $ sudo tail -f /var/log/messages | cut -c 29- kernel: [82049.560231] lost page write due to I/O error on sdb1 kernel: [82049.560239] lost page write due to I/O error on sdb1 kernel: [82105.825677] EXT4-fs (loop0): recovery complete kernel: [82105.825695] EXT4-fs (loop0): mounted filesystem with ordered data mode. Opts: (null) ■書き込み回数は驚くほど少ないので、「自然蒸発」の可能性が高い。 気になる「自然蒸発」と「セル寿命」 驚くほど長寿だが放置には注意 http://pc.nikkeibp.co.jp/article/basic/20091109/1020302/ ■I/Oエラーなので、不良ブロックをチェック。 fsckはサポートされているパーティションをチェックする場合には有効。 swapパーティションのようなfsckがサポートしていないファイルシステムの チェックは出来ないし、エラーが見つかっても、不良ブロックを取り込めない。 $ sudo dumpe2fs /dev/sdb1 | grep "^Block\|state" dumpe2fs 1.42.5 (29-Jul-2012) Filesystem state: clean Block count: 3765248 Block size: 4096 Blocks per group: 32768 $ /sbin/fsck -h 2>&1 | grep "\-c" -c Check for bad blocks and add them to the badblock list $ sudo fsck -c /dev/sdb5 fsck from util-linux 2.20.1 fsck: fsck.swap: not found fsck: error 2 while executing fsck.swap for /dev/sdb5 ■swapのチェックをするなら、badblocksを使う。 もしswapパーティションに不良ブロックが見つかったら、 swapoff、mkswap、swaponするか、 swapoffして、ext2でフォーマットしなおして、 badblocksとfsckで不良ブロックを教えた後に、 swap用のファイルを用意してそのファイルをmkswap、swaponする。 ディスクチェックの場合はブロックサイズもディスクのブロックサイズを使う。 不良ブロックを修復するのも大事ですが、出来れば早急に交換しましょう。 $ sudo badblocks -b 4096 -s /dev/sdc5 Checking for bad blocks (read-only test): 0.00% done, 0:00 elapsed. (0/0/0 errdone $ stat -c "%B" /dev/sdb | sed s/^/"Block Size="/ Block Size=512 $ man badblocks 2>/dev/null | grep "^ *\-[sb] " -b block-size -s スキャンの進行状況を表示する。ブロックがチェックされるごとに そ $ sudo badblocks -b 512 -n -s /dev/sdb Checking for bad blocks (read-only test): 0.00% done, 0:00 elapsed. (0/0/0 errdone