labunix's blog

labunixのラボUnix

debian wheezyのUSB起動インストーラの作成

■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