freebsd:freebsd_9.2r_migrate_hdd_to_ssd

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

freebsd:freebsd_9.2r_migrate_hdd_to_ssd [2015-04-03 07:56]
freebsd:freebsd_9.2r_migrate_hdd_to_ssd [2020-12-03 19:36] (現在)
Decomo Deleted by PageMove plugin
行 1: 行 1:
 +====== FreeBSD 9.2RをHDDからSSDに移動する ======
 +
 +===== 前書き =====
 +
 +slog/L2ARC用にSSDを購入したが、たかがキャッシュのために全領域を割り当てるのは流石に勿体ないので、HDDにあるシステムをSSDに移動して高速化を図ると共に/homeの領域を増やそう大作戦。
 +
 +===== 環境 =====
 +
 +^  システム | FreeBSD 9.2-RELEASE-p12 [Root on ZFS環境] ||
 +^  移行元 | HDD 1 |TOSHIBA MQ01ABD100 (1TB) ZFSミラー構成 |
 +^  :::    | HDD 2 |TOSHIBA MQ01ABD100 (1TB) ZFSミラー構成 |
 +^  移行先 | SSD 1 [ada9] | INTEL SSDSC2BA200G3T (200GB) |
 +^  :::    | SSD 2 [ada1] | Crucial CT128M550SSD1 (128GB) |
 +
 +{{ :freebsd:migrate_hdd_to_ssd_volume_layout.png?700 |}}
 +
 +  * システムは現状60GBを確保してあるが13GB程度しか使っていないので、SSD移行時に30GBへと縮小する。
 +  * <del>スワップは専用パーティションになっているが、SSD移行時にzvol形式に変更する。</del>
 +    * zvolのスワップは挙動が怪しそうなので、やっぱりSSDに専用パーティションを作る。基本的に物理メモリは不足しないものとし、スワップはあくまで緊急用の位置付けの8GBとする。
 +  * システム、ZILはSSD1とSSD2でミラー構成とする。
 +  * L2ARCは各SSD単体で確保する。
 +  * SSD1には仮想マシンの仮想HDD置き場を作る。
 +
 +===== 手順 =====
 +
 +==== SSDの準備 ====
 +
 +仮のプール''zssd''を作る。
 +
 +M550
 +<code>
 +$ sudo gpart create -s gpt ada1
 +ada1 created
 +$ sudo gpart add -a 4k -s 64k -t freebsd-boot ada1
 +ada1p1 added
 +$ sudo gpart add -a 4k -s 30g -t freebsd-zfs ada1
 +ada1p2 added
 +$ gpart show ada1
 +=>       34  250069613  ada1  GPT  (119G)
 +         34          6        - free -  (3.0k)
 +         40        128      freebsd-boot  (64k)
 +        168   62914560      freebsd-zfs  (30G)
 +   62914728  187154919        - free -  (89G)
 +</code>
 +
 +DC S3700
 +<code>
 +$ sudo gpart create -s gpt ada9
 +ada9 created
 +$ sudo gpart add -a 4k -s 64k -t freebsd-boot ada9
 +ada9p1 added
 +$ sudo gpart add -a 4k -s 30g -t freebsd-zfs ada9
 +ada9p2 added
 +$ gpart show ada9
 +=>       34  390721901  ada9  GPT  (186G)
 +         34          6        - free -  (3.0k)
 +         40        128      freebsd-boot  (64k)
 +        168   62914560      freebsd-zfs  (30G)
 +   62914728  327807207        - free -  (156G)
 +</code>
 +
 +忘れずにブートコードを書き込む。
 +<code>
 +$ sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
 +bootcode written to ada1
 +$ sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada9
 +bootcode written to ada4
 +</code>
 +
 +例によって4kセクタでzpoolを作る。
 +<code>
 +$ sudo gnop create -S 4096 /dev/ada1p2
 +$ sudo gnop create -S 4096 /dev/ada9p2
 +$ sudo zpool create ssd_zroot mirror ada1p2.nop ada9p2.nop
 +$ sudo zpool export ssd_zroot
 +$ sudo gnop destroy /dev/ada1p2.nop
 +$ sudo gnop destroy /dev/ada9p2.nop
 +$ sudo zpool import zssd
 +$ zpool status zssd
 +  pool: zssd
 + state: ONLINE
 +  scan: none requested
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + ssd_zroot   ONLINE               0
 +   mirror-0  ONLINE               0
 +     ada1p2  ONLINE               0
 +     ada9p2  ONLINE               0
 +
 +errors: No known data errors
 +</code>
 +
 +==== システムの移動 ====
 +
 +現行のHDDのシステムzrootをシングルユーザーモードで起動し、移行先の仮プールzssdにsnapshotをsend/recvする。作業自体は通常起動のシステムでも行えるけど、シングルユーザーモードの方がスナップショットと現状との差分が少なくて済むかなーと。
 +
 +尚、システムはzroot/ROOTに入っている。
 +
 +<code bash>
 +# zfs snapshot -r zroot/ROOT@mig
 +# zfs send -Rp zroot/ROOT@mig | zfs recv -vuFd zssd
 +receiving full stream of zroot/ROOT@mig into zssd/ROOT@mig
 +received 769MB stream in 2 seconds (385MB/sec)
 +receiving full stream of zroot/ROOT/usr@mig into zssd/ROOT/usr@mig
 +received 6.45GB stream in 99 seconds (66.8MB/sec)
 +...
 +</code>
 +
 +送受信が終わったら、忘れずに移行先のbootfsを設定する。
 +
 +<code bash>
 +# zpool set bootfs=zssd/ROOT zssd
 +</code>
 +
 +==== 移行先システムの起動確認 ====
 +
 +**移行元システムのHDDを物理的に外し**、移行先のSSDでシステムが起動するか確認する。
 +
 +mountrootで失敗するので、移行先のルートzfs:zssd/ROOTを指定する。
 +
 +<code>
 +Mounting from zfs:zroot/ROOT failed with error 2.
 +
 +Loader variables:
 +  vsf.root.mountfrom=zfs:zroot/ROOT
 +  
 +Manual root filesystem specification:
 +  <fstype>:<device> [options]
 +      Mount <device> using filesystem <fstype>
 +      and with the specified (optional) option list.
 +
 +    eg. usf:/dev/da0s1a
 +        zfs:tank
 +        cd9660:/dev/acd0 ro
 +          (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)
 +
 +  ?               List valid disk boot devices
 +  .               Yield 1 second (for background tasks)
 +  <empty line>    Abort manual input
 +
 +mountroot> zfs:zssd/ROOT
 +</code>
 +
 +これで正常に起動しなければ何かがおかしいので、最初から手順を見直す。
 +
 +==== 移行先プールの名称変更 ====
 +
 +USBメモリやCDなどの**FreeBSDインストーラで起動しShellに落ちる**(以後、fixit環境と呼ぶ)。
 +
 +ルートプール名を移行前と同じにしたいので、移行先のzssdプールをzrootにリネームする。
 +
 +念のためzssdがあるか確認。
 +<code bash>
 +# zpool import -N -o cachefile=/tmp/zpool.cache zssd
 +ZFS filesystem version: 5
 +ZFS storage pool version: features support (5000)
 +cannot import 'zroot': pool may be in use from other system
 +use '-f' to import anyway
 +</code>
 +
 +案の定「別システムのプールだよ」と警告されるので、-fオプションでインポート&名前変更。ついでにzpool.cacheを生成。
 +<code bash>
 +# zpool import -N -o cachefile=/tmp/zpool.cache -f zssd zroot
 +# zpool export zroot
 +# zpool import -N -o cachefile=/tmp/zpool.cache zroot
 +</code>
 +
 +Root on ZFS環境ではルートディレクトリのmountpointはlegacyになっているハズなので、適切にmountして生成したzpool.cacheを/boot/zfs/にコピーする。
 +<code bash>
 +mkdir /tmp/zroot
 +mount -t zfs zroot/ROOT /tmp/zroot
 +cp /tmp/zpool.cache /tmp/zroot/boot/zfs/
 +</code>
 +
 +マシンをシャットダウンする。
 +
 +==== 移行元ルートプールの削除 ====
 +
 +今度は**移行先のSSDを物理的に外し、移行前のシステムを付け**、fixit環境に入る。
 +
 +移行元のzrootがある事を確認し、問題がなければ<fc #ff0000>**躊躇せずに消す**</fc>。大丈夫、さっき移行先のシステムの起動を確認したんだから。自分を信じて。でも、もしシステムが再起不能になっても責任は負いません(←
 +
 +<code bash>
 +# camcontrol devlist
 +<TOSHIBA MQ01ABD100 AX0P7E>        at scbus0 target 0 lun 0 (ada0,pass0)
 +<TOSHIBA MQ01ABD100 AX0P7E>        at scbus8 target 0 lun 0 (ada2,pass4)
 +# zpool import -Nf zroot
 +# zpool status zroot
 +zpool status zroot
 +  pool: zroot
 + state: ONLINE
 +  scan: none requested
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + zroot       ONLINE               0
 +   mirror-0  ONLINE               0
 +     ada0p3  ONLINE               0
 +     ada2p3  ONLINE               0
 +# zpool destroy zroot
 +</code>
 +
 +作業途中で旧システムを消すのは恐ろしく、こういう事を趣味にしている人々は往々にして「何かあった時」のために保全しておきたくなるが、それは今回に限っては悪魔の囁きってヤツだ。下手に残しておくと新旧システムのプール情報が入り乱れる事になり逆に危険である。
 +
 +念には念を入れ、zrootの構成パーティションも削除(多分ここまでしなくても大丈夫)。
 +
 +<code bash>
 +# gpart delete -i 3 ada0
 +ada0p3 deleted
 +# gpart delete -i 3 ada2
 +ada2p3 deleted
 +</code>
 +
 +==== 各種パーティションの準備 ====
 +
 +移行先のシステムで起動し、slog/L2ARC/スワップ/VM用のパーティションを作る。
 +
 +M550
 +<code bash>
 +$ sudo gpart add -a 4k -s 8g -t freebsd-zfs ada1
 +ada1p3 added
 +$ sudo gpart add -a 4k -s 8g -t freebsd-zfs ada1
 +ada1p4 added
 +$ sudo gpart add -a 4k -s 40g -t freebsd-zfs ada1
 +ada1p5 added
 +</code>
 +
 +DC S3700
 +<code bash>
 +$ sudo gpart add -a 4k -s 8g -t freebsd-zfs ada9
 +ada9p3 added
 +$ sudo gpart add -a 4k -s 8g -t freebsd-zfs ada9
 +ada9p4 added
 +$ sudo gpart add -a 4k -s 40g -t freebsd-zfs ada9
 +ada9p5 added
 +$ sudo gpart add -a 4k -s 80g -t freebsd-zfs ada9 
 +ada9p6 added
 +$ sudo gpart add -a 4k -s 8g -t freebsd-swap ada9 
 +ada9p7 added
 +</code>
 +
 +==== スワップを有効化 ====
 +
 +/etc/fstabにスワップ情報を書く。
 +<code>
 +#Device        Mountpoint    FStype    Options    Dump    Pass#                              
 +/dev/ada9p7    none          swap      sw                                                
 +</code>
 +
 +正しくマウントされるか確認。
 +<code bash>
 +$ sudo swapon -aq
 +$ swapinfo -m
 +Device          1M-blocks     Used    Avail Capacity
 +/dev/ada9p7          8192        0     8192     0%
 +</code>
 +
 +==== /home用プールの拡張 ====
 +
 +HDDからシステム&スワップパーティションが無くなったので、晴れて/home用のパーティションを拡張する。ZFSミラー構成なので、行儀は悪いが片方をデタッチ→パーティション作り直し→ミラー再構築の繰り返しで対応する。
 +
 +ホームディレクトリ用プールをインポート
 +<code>
 +sudo zpool import zhome
 +</code>
 +
 +現状を確認。
 +<code bash>
 +$ zpool status zhome
 +  pool: zhome
 + state: ONLINE
 +  scan: scrub canceled on Sun Mar 22 10:40:24 2015
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + zhome       ONLINE               0
 +   mirror-0  ONLINE               0
 +     ada3p4  ONLINE               0
 +     ada0p4  ONLINE               0
 +
 +errors: No known data errors
 +</code>
 +
 +ミラーの片割れada0p4を外す。
 +<code bash>
 +$ sudo zpool detach zhome ada0p4
 +$ zpool status zhome
 +  pool: zhome
 + state: ONLINE
 +  scan: scrub canceled on Sun Mar 22 10:40:24 2015
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + zhome       ONLINE               0
 +   ada3p4    ONLINE               0
 +</code bash>
 +
 +現在のパーティション構成を確認し、不要なものを消す。
 +<code bash>
 +$ gpart show ada0
 +=>        34  1953525101  ada0  GPT  (931G)
 +          34                  - free -  (3.0k)
 +          40         128      freebsd-boot  (64k)
 +         168    41943040      freebsd-swap  (20G)
 +    41943208   125829120        - free -  (60G)
 +   167772328  1785548000      freebsd-zfs  (851G)
 +  1953320328      204807        - free -  (100M)
 +
 +$ sudo gpart delete -i 2 ada0
 +ada0p2 deleted
 +$ sudo gpart delete -i 4 ada0
 +ada0p4 deleted
 +$ sudo gpart delete -i 1 ada0
 +ada0p1 deleted
 +</code>
 +
 +でもって/home用のパーティションを作り直す。後ろに少し空きを持たせてるのは、HDD交換時に同容量を謳っていても微妙な容量違いで交換出来ない\(^o^)/という状況を防ぐため(1.5Gはやり過ぎだけど)。
 +
 +<code bash>
 +$ sudo gpart add -a 4k -s 930g -t freebsd-zfs ada0
 +ada0p1 added
 +$ gpart show ada0
 +=>        34  1953525101  ada0  GPT  (931G)
 +          34                  - free -  (3.0k)
 +          40  1950351360      freebsd-zfs  (930G)
 +  1950351400     3173735        - free -  (1.5G)
 +</code>
 +
 +今しがた作ったパーティションで再びミラーにする。
 +<code bash>
 +$ sudo zpool attach zhome ada3p4 ada0p1
 +$ zpool status zhome
 +  pool: zhome
 + state: ONLINE
 +status: One or more devices is currently being resilvered.  The pool will
 + continue to function, possibly in a degraded state.
 +action: Wait for the resilver to complete.
 +  scan: resilver in progress since Sun Mar 29 11:57:01 2015
 +        34.4M scanned out of 389G at 1.19M/s, 93h9m to go
 +        34.1M resilvered, 0.01% done
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + zhome       ONLINE               0
 +   mirror-0  ONLINE               0
 +     ada3p4  ONLINE               0
 +     ada0p1  ONLINE                (resilvering)
 +
 +errors: No known data errors
 +</code>
 +
 +389GBを2.5時間程でリビルド出来た。ada3の方も同様に行う。
 +
 +両HDDとも拡張ができたら、仕上げにzpoolに容量拡張を通知して初めてプール容量が増える(autoexpandプロパティがonになってれば勝手に増えるけども)。
 +
 +<code bash>
 +$ zfs list zhome
 +NAME    USED  AVAIL  REFER  MOUNTPOINT
 +zhome   389G   446G   152K  /zhome
 +
 +$ sudo zpool online -e zhome ada0p1
 +zfs list zhome
 +NAME    USED  AVAIL  REFER  MOUNTPOINT
 +zhome   389G   525G   152K  /zhome
 +</code>
 +
 +==== slog/L2ARCの有効化 ====
 +
 +/home用プールzhomeにslogとL2ARCを追加する。slog追加時mirror指定をしないとミラーにならなず、かと言って付けなくても失敗はしないので要注意。
 +
 +<code>
 +$ sudo zpool add zhome log mirror ada1p3 ada9p3
 +$ sudo zpool add zhome cache ada9p5
 +$ zpool status zhome
 +  pool: zhome
 + state: ONLINE
 +  scan: resilvered 389G in 2h31m with 0 errors on Sun Mar 29 16:58:56 2015
 +config:
 +
 + NAME        STATE     READ WRITE CKSUM
 + zhome       ONLINE               0
 +   mirror-0  ONLINE               0
 +     ada0p1  ONLINE               0
 +     ada3p1  ONLINE               0
 + logs
 +   mirror-1  ONLINE               0
 +     ada1p3  ONLINE               0
 +     ada9p3  ONLINE               0
 + cache
 +   ada9p5    ONLINE               0
 +</code>