Linuxの起動ディスクのファイルシステムを Ext4 から Btrfsへ移行する
概要
ルートファイルシステムを Ext4 で構成したシステムを Btrfs に移行したくなったので移行してみた。 環境は Ubuntu16.04。
想定環境
/dev/sdx 移行元とは別のLinuxシステムでの作業とする。 (USBとかからLiveイメージを起動するとか。)
- /dev/sda: 移行元ディスク
- /dev/sda1: 移行元システム(Ubuntu 16.04, ext4)
- /dev/sdb: 移行先ディスク
- /dev/sdb1: 移行元システム(Ubuntu 16.04, ext4)
- /dev/sdb2: 移行元システム(スワップ)
- /dev/sdx: 移行作業を行う独立したLinuxシステム
移行先ディスク sdb のパーティションを切って btrfs でフォーマット
例として、/dev/sdb の90%を btrfs として使い、残りをスワップとして使う。 btrfs内ではswapfileを使うことはできないので、 スワップを必要とする場合は初期のパーティションの時点で作成しなければならない。
$ sudo parted -a optimal -s /dev/sdb -- mklabel msdos
$ sudo parted -a optimal -s /dev/sdb -- mkpart 0% 90%
$ sudo parted -a optimal -s /dev/sdb -- mkpart 90% 100%
$ sudo parted -a optimal -s /dev/sdb -- set 1 boot on
$ sudo mkfs.btrfs -f /dev/sdb1
$ sudo mkswap /dev/sdb2
sda1, sdb1をマウントしてシステムを同期する
それぞれのファイルシステムをマウントするところを作って、マウントする。
$ sudo mkdir /mnt/sda
$ sudo mount /dev/sda /mnt/sda
$ sudo mkdir /mnt/sdb
$ sudo mount /dev/sdb /mnt/sdb
$ sudo rsync -av /mnt/sda1 /mnt/sdb
fstabを設定する
blkidコマンドでUUIDを確認する。
sudo blkid | grep sdb
/dev/sdb1: UUID="87a9e63a-0b71-4334-b364-cb0a5905dd73" UUID_SUB="427c8bfc-10a9-4e3e-83b0-e227e1e2f172" TYPE="btrfs" PARTUUID="5a94371a-01"
/dev/sdb2: UUID="7688196b-9b9d-4091-adf1-5990d49923ad" TYPE="swap" PARTUUID="5a94371a-02"
確認したUUIDを元に /mnt/sdb/etc/fstab を以下のように設定する。 btrfsのオプションはcompress=lzoのみ有効にした。
UUID=87a9e63a-0b71-4334-b364-cb0a5905dd73 / btrfs defaults,compress=lzo,subvol=/ 0 0
UUID=7688196b-9b9d-4091-adf1-5990d49923ad none swap sw 0 0
GRUBの設定
/mnt/sdb/etc/grub.d/00_header から、↓の2行のうち、一つを消す。
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
もしくは /etc/default/grub に↓を追記する。
移行先ファイルシステムへchrootする
$ sudo mount --bind /dev /mnt/sdb/dev
$ sudo mount --bind /proc /mnt/sdb/proc
$ sudo mount --bind /sys /mnt/sdb/sys
$ chroot /mnt/sdb
(chroot)$
sdbへGRUBをインストールする
chrootをしないでも↓で良いかもしれない。
GRUBをインストールする際に↓のようなエラーが出る場合がある。
grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels. This is not supported yet..
grub-install: error: filesystem `btrfs' doesn't support blocklists.
その場合はwipefs↓をする。
再起動
上記までで設定は終わりで、BIOSから起動ディスクを/dev/sdbに切り替えることによって、 移行先のbtrfsのファイルシステムから起動がはじまるはず。