一致するサービスが見つかりません
稼働中のVPSにZFSをルートとしてインストールする方法
このガイドでは、既存のLinuxインストールを含むVPSのルートファイルシステムとしてZFSをインストールし、データ損失を引き起こさずに設定する方法を説明します。VPSには、GRUB2用の小さなEXT4ブートパーティション(カーネルとinitrdを含む)と、圧縮が有効な大きなZFSプールがルートにマウントされます。ほとんどのコマンドはライブCDイメージから実行され、VPSがISOイメージのマウントをサポートしていない場合の回避策も示されます。
- 目次:
- 1. データのバックアップ
- 2. ライブOSイメージの起動
- 3. ライブOS環境にZFSをインストール
- 4. VPSディスクのパーティション分割
- 5. VPSディスクにZFSをインストール
- 6. 新しいZFSルートファイルシステムにバックアップを復元
- 7. GRUB2をインストール
- 8. ZFSルートプールで起動
- ステップ1: データをバックアップする
-
バックアップデータを保存するための十分なスペースがある別のVPSまたはホームコンピュータがある場合、そのコンピュータから以下のコマンドを実行します:
ここで、targetは変換対象のVPSのホスト名です。これにより、ルートファイルシステム全体がSSH経由でバックアップマシンにコピーされ、後でこのバックアップを対象のVPSに復元するのは簡単です。スペースが不足しているためにバックアップを圧縮する必要がある場合は、代わりに圧縮されたTGZアーカイブを作成できます:
# rsync -aqrxz root@target:/ backup.d
ただし、TARアーカイブからルートファイルシステムを復元する場合、絶対パス名を持つすべてのシンボリックリンクを再作成する必要があります。なぜなら、TARはそれらのターゲットを相対パス名に変換するため、rsyncを使用する方が簡単な代替手段です。TARアーカイブを適切に復元する方法については後ほど説明します。# ssh root@target "tar -cf - --acls --xattrs --one-file-system --absolute-names /" | gzip -1 >backup.tgz
- ステップ2: ライブOSイメージを起動する
-
ZFSへの変換は、ライブCDオペレーティングシステムから行われます。VPSコントロールパネルの機能によっては、すでに起動可能なライブOSイメージが用意されている場合があります。あるいは、DebianミラーからDebianライブISOをダウンロードし、VPSコントロールパネルにアップロードして、そこからISOを起動することもできます。これは、VPSが別のディストリビューションを実行している場合でも問題なく動作します。ライブOSのISOイメージを使用するように注意してください。インストールISOではなく、インストールイメージにはaptが含まれておらず、ライブ環境に必要なソフトウェアをインストールできないためです。VPSコントロールパネルがユーザー提供のISOイメージからの起動をサポートしている場合は、ステップ3に進んでください。そうでない場合でも、スワップパーティションをEXT4に変換し、その回収されたストレージスペースにISOを保存することで、ダウンロードしたISOを起動することができます。その後、GRUB2を設定してそのISOから起動することができます。これは以下のように行われます:
# fdisk --list /dev/vda
ディスク /dev/vda: 35 GiB, 37580963840 バイト, 73400320 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理/物理): 512 バイト / 512 バイト
I/O サイズ (最小/最適): 512 バイト / 512 バイト
ディスクラベルタイプ: dos
ディスク識別子: 0x495b5ce4
デバイス ブート 開始 終了 セクタ サイズ Id タイプ
/dev/vda1 * 2048 69203583 69201536 33G 83 Linux
/dev/vda2 69203584 73397887 4194304 2G 82 Linux スワップ
# swapoff /dev/vda2 # スワップパーティションを無効にする
# mkfs.ext4 /dev/vda2 # EXT4ファイルシステムを作成する
# mount /dev/vda2 /mnt # 再利用したスペースをマウントする
# mkdir /mnt/images/
# wget -O /mnt/images/image_file.iso <image_URL>
#!/bin/sh
exec tail -n +3 $0
# このファイルは、カスタムメニューエントリを簡単に追加する方法を提供します。このコメントの後に
# 追加したいメニューエントリを入力してください。'exec tail'の行を変更しないように注意してください。
menuentry "Live ISO" {
set ISOFile="/images/image_file.iso"
loopback loop (hd0,2)$ISOFile
linux (loop)/live/vmlinuz boot=live findiso=$ISOFile
initrd (loop)/live/initrd.img
}
update-grub2
- ステップ3: ライブOS環境にZFSをインストール
-
ライブOSイメージを起動し、そのターミナルにアクセスします。次に、ライブOS環境にZFSパッケージをインストールします:
# echo deb http://deb.debian.org/debian stretch contrib >> /etc/apt/sources.list
# apt update
# apt install zfs-dkms
# modprobe zfs
- ステップ4: VPSディスクをパーティション分割
-
VPSディスクをパーティション分割するには、以下の2つのシナリオがあります:
- ライブISOを/dev/vda2に保存した場合、現在そのパーティションを変更することはできません。なぜなら、ライブシステムがそれに依存しているためです。VPSディスクに対してパーティション分割は一切行われません。ZFSは既存の/dev/vda2パーティションにフォーマットされ、/dev/vda1はそのまま残り、後でカーネルとinitrdを保存するための永続的なブートパーティションとして再利用されます。ステップ5に進んでください。
-
ライブ環境がVPSディスクに保存されたISOファイルに依存していない場合、GRUB2用の小さなブートパーティションと、残りのすべてのディスク領域にまたがるZFSルート用の大きなパーティションを作成してディスクを再パーティション化します。以下の2つのパーティションを作成するためにfdiskを実行します:
# fdisk /dev/vda
Command (m for help): p
Disk /dev/vda: 35 GiB, 37580963840 bytes, 73400320 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
Disklabel type: dos
Disk identifier: 0x495b5ce4
Device Boot Start End Sectors Size Id Type
/dev/vda1 2048 69203583 69201536 33G bf Solaris
/dev/vda2 * 69203584 73397887 4194304 2G 83 Linux
# mkfs.ext4 /dev/vda2
- ステップ5: VPSディスクにZFSをインストール
-
/dev/vda1をZFSボリュームとしてフォーマットします:
# zpool create -o ashift=12 \
-O acltype=posixacl -O canmount=on -O compression=zstd \
-O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
-O mountpoint=/ -R /mnt \
rpool /dev/vda1
- ステップ6: 新しいZFSルートファイルシステムにバックアップを復元する
-
バックアップVPSからバックアップデータを受信するために、ライブ環境にOpenSSHサーバーをインストールします:
# apt install openssh-server
# passwd
# service restart ssh
## from the backup VPS
# rsync -arxz backup.d/* root@target:/mnt/
## from the backup VPS
# cat backup.tgz | ssh root@target "tar -C /mnt -zaxf -"
## from the backup VPS
# tar -tvf backup.tgz | egrep -- '->' >list_of_symlinks.txt
## from the backup VPS
# scp list_of_symlinks.txt root@target:/mnt/root/
## from the chroot environment
while read -r row; do
src=$(echo "$row" | grep -Po '(?<=[0-9]{2}:[0-9]{2} )[^ ]+')
tgt=$(echo "$row" | grep -Po '(?<= -> ).+')
echo "linking: $src -> $tgt"
ln -fs "$tgt" "$src"
done </root/list_of_symlinks.txt
- ステップ7: GRUB2をインストールする
-
chroot内にいる場合は、それを終了してライブ環境に戻ります。その後、仮想ファイルシステムを/mntにバインドし、ブートパーティションをマウントします:
# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys
# mount /dev/vda2 /mnt/boot
# chroot /mnt
# apt install pkg-dev linux-headers-amd64 linux-image-amd64
# apt install zfs-dkms zfs-initramfs
# apt install grub-pc
# update-initramfs -u -k all
## this is /etc/default/grub
GRUB_CMDLINE_LINUX="root=ZFS=rpool"
# update-grub
# grub-install /dev/vda
- ステップ 8: ZFS ルートプールで起動する
-
システムは準備が整い、バックアップから完全に復元され、起動可能です。chroot を終了し、すべての仮想ファイルシステムをアンマウントしてから、ZFS ルートプールをエクスポートします:
# exit # rpool chroot を終了します
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# umount /mnt/boot
# umount /mnt
# zpool export -a
# reboot
もっと記事を読む