June 30 Sat, 2012
3TB SATA HDD を HP ML115 / Debian GNU/Linux に導入した備忘録
Posted by yoosee on Debian at 2012-06-30 14:13 JST1 3TB SATA HDD の Debian GNU/Linux での初期設定
HDDがなかなか安くならないなとしばらく様子を伺っていたが、自宅サーバの容量が一杯になりつつあるので流石に諦めてSeagate Barracuda 7200シリーズ 3.5inch SATA 6Gb/s 3TB 7200rpm 64MB 4Kセクター ST3000DM001 を $149.99 で購入。値段は1ドル80円換算で日本とほとんど変わらない。下記は Debian GNU/Linux wheezy/sid での設定とディスク内容のマイグレーションを備忘録として書いたものだが、正確性は担保しないので当然ながら自己責任で参考にしてください。まずは自宅のHP ML115に追加接続して Linux で起動。ちなみに元々の disk が sda で新しく導入した disk が sdb 。
[ 1.848040] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 1.856296] ata1.00: ATA-8: ST3000DM001-9YN166, CC4B, max UDMA/133 [ 1.856301] ata1.00: 5860533168 sectors, multi 16: LBA48 NCQ (depth 31/32) [ 1.872281] ata1.00: configured for UDMA/133 ... [ 2.676866] sd 0:0:0:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB) [ 2.676872] sd 0:0:0:0: [sdb] 4096-byte physical blocks [ 2.676935] sd 0:0:0:0: [sdb] Write Protect is off [ 2.676939] sd 0:0:0:0: [sdb] Mode Sense: 00 3a 00 00 [ 2.676967] sd 0:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA起動時に認識はしている。BIOSなどによっては認識しないこともあるらしいのでそこは一安心。今回は2TBより大きなディスクなので fdisk/cfdisk では正しく扱えない (確か700GB程度しか認識しない状態になるはず) ため parted にて GPT を使う。まあ今時 parted だよねーという話ではある。ちなみに partition を切る必要が無ければ
# mkfs -t ext4 /dev/sdbとかして丸ごと使う分には 3TB でも問題なく行けるはず。さておき。下記ではまず最初に label を gpt に設定した後、1 を / partition (ext3, rootfs, bootable) 10GiB 、2 が swap で 4Gib、3 で残り全てをLVMに割り当てている。コンサバ気味に rootfs は lvm 上ではなく素の primary 上に ext3 で作っている。1 の start を 2048s にしているのは 0 だと alignment がどうのと怒られたから。なお parted は interactive なやりとり中に disk を実際にいじっているので操作間違いにはくれぐれも注意。X で使ってるなら gparted の方がいいかも。
# parted /dev/sdb (parted) mklabel gpt ... (parted) mkpart primary 2048s 10GiB ... (parted) set 1 boot on ... (parted) mkpartfs primary linux-swap 10Gib 14GiB ... (parted) mkpart primary 14Gib -1s ... (parted) set 3 lvm on ... (parted) print Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdb: 3001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Number Start End Size File system Name Flags 1 1049kB 4295MB 4294MB ext3 primary 2 4295MB 8590MB 4295MB primary 3 8590MB 3001GB 2992GB primary lvm (parted) quitそうしておいて LVM 部分を更に /usr /var /home に切り分け。この辺は趣味の世界だけど、昔からの習性で自分で Linux を入れるときはなんとなくこの構成にしていることが多い。今時だと /var はもっと大きくてもいいが、Virtual Machine なんかも /home の下に作れば済むのでこれくらいにしてる。LVM の基本的な使い方は 基本的なLVMの使い方 や A Beginner's Guide To LVM 等を参照のこと。
# pvcreate /dev/sdb3 # pvscan PV /dev/sda3 VG userspace lvm2 [2.72 TiB / 0 free] Total: 1 [2.72 TiB] / in use: 1 [2.72 TiB] / in no VG: 0 [0 ] # vgcreate uservolume00 /dev/sdb3 # vgscan Reading all physical volumes. This may take a while... Found volume group "uservolume00" using metadata type lvm2 # lvcreate -L 10G -n usr # lvcreate -L 20G -n var # lvcreate -l 100%FREE -n home # lvscan ACTIVE '/dev/uservolume00/var' [20.00 GiB] inherit ACTIVE '/dev/uservolume00/usr' [10.00 GiB] inherit ACTIVE '/dev/uservolume00/home' [2.69 TiB] inheritあとは普通にファイルシステムを作る。
# mkfs -t ext4 /dev/uservolume00/home # mount -t ext4 /dev/uservolume00/home /mnt ...
2 rootfs その他を新しい disk に切り替え
元のファイルシステムは LVM とかじゃない素の partition なので、あまり素敵技術は使えない。もっと賢い方法があったら知りたいけど、とりあえず単純に rsync する。真面目にやる人は当然 single user mode でやりましょう。# mkdir /target # mount /dev/sdb1 /target # mkdir /target/usr /target/var # mount /dev/usrvolume00/usr /target/usr # mount /dev/usrvolume00/var /target/var # mount /dev/usrvolume00/home /target/home # rsync -avD /etc /bin /sbin /boot /lib /lib32 /lib64 /usr /var /target # rsync -avD /home /target # rsync -avD /vmlinuz /initrd.img /targetmount で見て殆どの tmpfs, procfs, sysfs, udev, devpts, cgroup とかは勝手に面倒見てくれるはずなので directory だけ作っておく。
# mkdir /target/proc /target/sys /target/run /target/dev /target/root /target/mnt /target/tmp新しいシステムでの /etc/fstab (/target/etc/fstab)を書き換え。 LVM じゃないやつは最初に UUID を取っておく。parted から label つけて使ってもいいけどそこはお好みで。
# blkid /dev/sdb1 /dev/sda1: UUID="......-.....-....." TYPE="ext3"swap も確保してるので作っておく。今時の mkswap なら UUID も勝手に割り当ててくれるはず。
# mkswap /dev/sda2/target/etc/fstab を編集。
UUID="......-.....-....." / ext3 defaults 0 1 /dev/uservolume00/usr /usr defaults 0 2 /dev/uservolume00/var /var defaults 0 2 /dev/uservolume00/home /home defaults 0 2 UUID="......-.....-....." none swap sw 0 0あとは grub を入れれば終わり。そのまま入れても initrd 等がおかしくなるので新しい / に chroot して linux-image を reconfigure する作戦。あと grub-install は GPT だと文句を言ってくるので --force で無理やり入れてしまう。
# chroot /target # dpkg-reconfigure linux-image-3.2.0-2-amd64 # grub-install /dev/sdb --forceとりあえず /boot/grub/grub.cfg の当該部分はこんな感じに。
menuentry 'Debian GNU/Linux, with Linux 3.2.0-2-amd64' --class debian --class gnu-linux --class gnu --class os { insmod gzio insmod part_gpt insmod ext2 set root='(hd1,gpt1)' search --no-floppy --fs-uuid --set=root a61b7b93-5992-49d3-aa12-ea65ec3d3325 echo 'Loading Linux 3.2.0-2-amd64 ...' linux /boot/vmlinuz-3.2.0-2-amd64 root=UUID=a61b7b93-5992-49d3-aa12-ea65ec3d3325 ro quiet echo 'Loading initial ramdisk ...' initrd /boot/initrd.img-3.2.0-2-amd64 }物理的に sda と sdb のケーブルを繋ぎかえて再起動すれば完了、のはず。UUIDやLVMで管理しているので繋ぎ変える必要はないのだけど、これも趣味の問題である。