【ubuntu】LVMの再帰的な利用法とパーティーションのコピーとBCACHE
論理ボリュームの管理がパーティーションに比べて楽なLVM。
パーティーションをPV(物理ボリューム)に設定して、VG(ボリュームグループ)にまとめ、LV(論理ボリューム)に切り出すやりかたで、必要とあらばVGに新しいPVを登録して拡張することも、LVのサイズを拡大・縮小することもできます。
ところで、LVを新しくPVに設定して、別のVGに登録できるというのは知っていますか?
LVMの設定をちょっと変えるだけでそれが可能なのです。
LVMの再帰的な利用法
$ sudo nano /etc/lvm/lvm.conf
lvm.confのdevices {}内にあるscan_lvs=0、これをscan_lvs=1に変更するだけで、再帰的な構造が作れます。
うちの環境ですが、PVのリストがこうなっています。
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/main/boot boot lvm2 a-- <10.00g <5.50g
/dev/sda5 main lvm2 a-- <20.00g <6.00g
/dev/sdb3 main lvm2 a-- <500.00g <294.00g
VG bootが使っているPVが/dev/main/bootになっています。
これはVG main内に作ったbootというLVのことを指しています。
VG mainではルートファイルシステムを、VG bootでは/bootを格納しています。
ルートファイルシステムと/bootは関連性が高いのでVG bootをVG mainの中に入れ子にしています。
$ sudo lvs -o +devices main/boot
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
boot main -wi-ao---- 10.00g /dev/sdb3(0)
今は/dev/main/bootをハードディスクである/dev/sdb3に置いてありますが、必要ならSSDの/dev/sda5に移動することも可能です。
bcacheデバイスの作り方(1)
bcacheはLVM cacheと並ぶ、HDDをSSDでキャッシュする手段です。
一組のSSD/HDDペアを作る方法は簡単です。
$ sudo make-bcache -B /dev/hdd -C /dev/ssd
これだけでbcache0デバイスが作られ、キャッシュパーティーションのアタッチも自動でやってくれます。
後は/dev/bcache0にファイルシステムを作るだけです。
ファイルシステムのコピー
これからbcache0デバイスを起動ドライブにしようとするわけですが、そのためには/bootに割り当てるデバイスと、ファイルシステムのコピーが必要になります。
面倒なのでLVを作ってサクッとやっちゃいましょう。
bcache0デバイスに入れたいファイルシステムとは別のlinuxファイルシステム(ライブCDでも可)から立ち上げます。
そして、LVをサクサクと作ります。
$ sudo lvcreate -n new -L 60G main /dev/hdd
$ sudo lvcreate -n new -L 1G boot /dev/hdd
$ sudo lvcreate -n new-cache -L 5G main /dev/ssd
$ sudo make-bcache -B /dev/main/new -C /dev/main/new-cache
$ sudo mkfs.ext4 /dev/bcache0
$ sudo mkfs.ext4 /dev/boot/new
これでファイルシステムのフォーマットまで終わりました。
続いて、既存のファイルシステムをマウントします。
$ sudo mkdir /mnt/{from,to}
$ sudo mount /dev/main/old /mnt/from
$ sudo mount /dev/boot/old /mnt/from/boot
$ sudo mount /dev/bcache0 /mnt/to
$ sudo mkdir /mnt/to/boot
$ sudo mount /dev/boot/new /mnt/to/boot
新旧のファイルシステムのマウントが終了しました。
後はコピーするだけです。
$ sudo rsync -ahHv /mnt/from/* /mnt/to
rsyncで古いファイルシステムから新しいファイルシステムへファイル/ディレクトリをコピーします。
コピーが終わったら、bcache0から起動するための準備を行います。
まずは特殊なディレクトリを/mnt/toにマウントした後、chrootします。
$ for fs in {sys,proc,dev};do sudo mount --rbind /$fs /mnt/to/$fs;done
$ sudo chroot /mnt/to
bcache0デバイスのuuidをコピーします。
# ls /dev/bcache/by-uuid/2836f23c-1162-45cf-847f-ff062c4cb511 -l
lrwxrwxrwx 1 root root 13 9月 2 19:24 /dev/bcache/by-uuid/2836f23c-1162-45cf-847f-ff062c4cb511 -> ../../bcache0
/etc/fstabを書き換えます。
/にマウントするデバイスは、/dev/bcache0でもいいのですが、複数bcacheデバイスを作った時にナンバリングが入れ替わってしまう懸念があるので、さきほどコピーしたuuidの入ったデバイス名を使います。
# nano /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/bcache/by-uuid/2836f23c-1162-45cf-847f-ff062c4cb511 / ext4 errors=remount-ro 0 1
/dev/boot/new /boot ext4 defaults 0 2
/swapfile none swap sw 0 0
grubデータを書き換え、grubを物理デバイスにインストールします。
# update-grub
# grub-install /dev/hdd
# exit
これでbcache0デバイスから起動させる手順が終了しました。
bcacheデバイスの作り方(2)
ここでは、2つのファイルシステムでキャッシュを共有する方法を紹介します。
新しくバッキングデバイスを作ります
$ sudo lvcreate -n new2 -L 60G main
$ make-bcache -B /dev/main/new2
キャッシュデバイスのuuidを取得します。
$ sudo bcache-super-show /dev/main/new-cache |grep cset
cset.uuid 5b3540df-5a65-4cbe-8d07-5e149460cf45
キャッシュデバイスをbcache1にアタッチします。
sudoでechoでファイルに書き込むのがちょっとめんどくさいので、sudo -iで管理者モードに移行します。
$ sudo -i
# echo 5b3540df-5a65-4cbe-8d07-5e149460cf45> /sys/block/bcache1/bcache/attach
またはこういう方法もあります。
$ echo 5b3540df-5a65-4cbe-8d07-5e149460cf45| sudo tee /sys/block/bcache1/bcache/attach
ちゃんとアタッチできているか確認してみましょう。
$ ls /sys/block/bcache1/bcache/dev/slaves/
dm-13 dm-21
$ ls /dev/main -l |grep dm-21
lrwxrwxrwx 1 root root 8 9月 2 20:17 new2 -> ../dm-21
$ ls /dev/main -l |grep dm-13
lrwxrwxrwx 1 root root 8 9月 2 19:24 new-cache -> ../dm-13
キャッシュのデタッチはこうです。
$ echo 5b3540df-5a65-4cbe-8d07-5e149460cf45| sudo tee /sys/block/bcache1/bcache/detach
キャッシュを解放する場合。
$ echo 1|sudo tee /sys/fs/bcache/5b3540df-5a65-4cbe-8d07-5e149460cf45/stop
キャッシュの内容を消去する場合は以下のコマンドです。
$ sudo wipefs -a /dev/main/new-cache