価格でランク付けされたVPSの独立した検索エンジン

一致するサービスが見つかりません

稼働中の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またはホームコンピュータがある場合、そのコンピュータから以下のコマンドを実行します:
# rsync -aqrxz root@target:/ backup.d
ここで、targetは変換対象のVPSのホスト名です。これにより、ルートファイルシステム全体がSSH経由でバックアップマシンにコピーされ、後でこのバックアップを対象のVPSに復元するのは簡単です。スペースが不足しているためにバックアップを圧縮する必要がある場合は、代わりに圧縮されたTGZアーカイブを作成できます:
# ssh root@target "tar -cf - --acls --xattrs --one-file-system --absolute-names /" | gzip -1 >backup.tgz
ただし、TARアーカイブからルートファイルシステムを復元する場合、絶対パス名を持つすべてのシンボリックリンクを再作成する必要があります。なぜなら、TARはそれらのターゲットを相対パス名に変換するため、rsyncを使用する方が簡単な代替手段です。TARアーカイブを適切に復元する方法については後ほど説明します。
ステップ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 スワップ
このVPSには、ISOを保存するのに十分な大きさの2GBのスワップパーティションが/dev/vda2にあります。EXT4ファイルシステムを作成し、それをマウントしてISOをダウンロードします:
# swapoff /dev/vda2     # スワップパーティションを無効にする
# mkfs.ext4 /dev/vda2   # EXT4ファイルシステムを作成する
# mount /dev/vda2 /mnt  # 再利用したスペースをマウントする
# mkdir /mnt/images/
# wget -O /mnt/images/image_file.iso <image_URL>
次に、GRUB2にこのISOから起動するように指示します。/etc/grub.d/40_customを以下のように編集します:
#!/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
VPSを再起動すると、GRUB2メニューにライブイメージから起動するオプションが表示されます。プロバイダーのコントロールパネルで提供されているVNCレスキューコンソールを使用して、そこから進めてください。
ステップ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
これで、ライブOSにはVPSのルートファイルシステムをフォーマットするために必要なZFSカーネルモジュールとZFSユーティリティがインストールされました。
ステップ4: VPSディスクをパーティション分割
VPSディスクをパーティション分割するには、以下の2つのシナリオがあります:
  1. ライブISOを/dev/vda2に保存した場合、現在そのパーティションを変更することはできません。なぜなら、ライブシステムがそれに依存しているためです。VPSディスクに対してパーティション分割は一切行われません。ZFSは既存の/dev/vda2パーティションにフォーマットされ、/dev/vda1はそのまま残り、後でカーネルとinitrdを保存するための永続的なブートパーティションとして再利用されます。ステップ5に進んでください。
  2. ライブ環境が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
    100MBの幅を持つプライマリブートパーティションを作成し、アスタリスク(*)でブート可能としてマークし、パーティションID = 83(Linux)を設定します。GRUB2との互換性のためにEXT4としてフォーマットされ、ブートデータが含まれます。次に、ID = bf(Solaris)のZFS用の別のプライマリパーティションを作成します。変更をディスクに書き込み、fdiskを閉じます。ディスクが適切にパーティション分割されたので、ブートパーティションをフォーマットできます:
    # 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
このオプションセットは、最新および将来のディスクとの最高の互換性を確保するためにZFSドキュメントで推奨されています。compression=zstdオプションは、デフォルトのLZ4よりも高い圧縮率を持つZSTD圧縮アルゴリズムを有効にしますが、VPSのディスクI/Oが高い場合は、CPU使用率を抑えるためにcompression=lz4を使用することもできます。プールはrpoolと名付けられており、これはルートプールに最も一般的に使用される名前です。このコマンドが完了すると、rpoolはライブ環境の/mntディレクトリにマウントされます(上記の-R /mntオプションで指定されています)が、以降の起動時には自動的に/にマウントされます。ライブ環境からバックアップを復元するために、/mntにマウントすることが必要です。
ステップ6: 新しいZFSルートファイルシステムにバックアップを復元する
バックアップVPSからバックアップデータを受信するために、ライブ環境にOpenSSHサーバーをインストールします:
# apt install openssh-server
簡略化のため、ライブ環境の /etc/ssh/sshd_config で PermitRootLogin yes を有効にし、安全なrootパスワードを設定してOpenSSHを再起動します:
# passwd
# service restart ssh
そして、バックアップVPSからバックアップデータの復元を開始し、/mnt にマウントされたZFSルートプールを構築します:
## from the backup VPS
# rsync -arxz backup.d/* root@target:/mnt/
または、TARを使用してバックアップアーカイブを作成した場合は、以下のように復元します:
## from the backup VPS
# cat backup.tgz | ssh root@target "tar -C /mnt -zaxf -"
ただし、ステップ1で述べたように、TARは抽出時に絶対シンボリックリンクのターゲットパスを相対パスに変換します。これらのシンボリックリンクは以下のようにすべて適切に復元できます。なお、ルートファイルシステムのバックアップにTARを使用しなかった場合、この復元は必要ありません。バックアップVPSから、アーカイブに含まれるすべてのシンボリックリンクをリストアップします:
## from the backup VPS
# tar -tvf backup.tgz | egrep -- '->' >list_of_symlinks.txt
次に、リストをターゲットのVPSにコピーし、/mntに配置します。これで、バックアップから再構築されたルートファイルシステムが含まれます:
## from the backup VPS
# scp list_of_symlinks.txt root@target:/mnt/root/
ターゲットのVPSから、/mntにchrootし、以下のBashスクリプトを実行してすべての絶対シンボリックリンクを復元します:
## 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
/mnt/boot/にある既存のコンテンツを新しいブートパーティションにコピーすることもできます。ルートプールにchrootし、その中からZFS initramfsフック、ZFSカーネルモジュール、およびinitrdを生成するために必要なZFSユーザースペースツールをインストールします:
# chroot /mnt
# apt install pkg-dev linux-headers-amd64 linux-image-amd64
# apt install zfs-dkms zfs-initramfs
その後、GRUB2パッケージをインストールします:
# apt install grub-pc
# update-initramfs -u -k all
/etc/default/grub を編集して、GRUB_CMDLINE_LINUX 変数を変更し、ZFS プールをルートデバイスとして設定します:
## this is /etc/default/grub
GRUB_CMDLINE_LINUX="root=ZFS=rpool"
その後、設定を適用します:
# update-grub
最後に、GRUB2 を MBR にインストールします:
# 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
ISOイメージをVPSコントロールパネルから削除するか、ハードドライブからISOを削除し、システムをZFSルートプールに再起動できます(このオプションを使用した場合):
# reboot
VPSのルートファイルシステムのEXT4からZFSへの変換が完了し、VPSは通常どおりにインストールされた古いシステムで起動します。

もっと記事を読む
アラビア語 インドネシア語 スペイン語 ドイツ語 トルコ語 フィリピン語 フランス語 ベトナム語 ベンガル語 ポーランド語 ポルトガル語 マレー語 ロシア語 中国語 日本語 英語 韓国語
ヘルプ  –  インデックス  –  プライバシーポリシー  –  お問い合わせ  –