先週、私は私のサーバーの1つでDebian OSをアップグレードすることに決めました。アップグレード自体は基本的には単純です。sources.listファイルに新しいパッケージリポジトリを入力し、その後apt-get -y update、apt-get -y upgrade、apt-get -y full-upgradeを実行します(その他いくつかのことをします)。すべてをうまく実行し、最後にrebootコマンドが残りました。これでシステムが再起動されます。1分か2分待つと、サーバーはアップグレードされたOSで起動するはずです。ただし、そうはなりませんでした。5分後にも10分後にも応答がありませんでした。これは…警告信号です。特に、サーバーが遠く離れた場所にある場合…(スロベニアのどこかに、またはヨーロッパのどこかに)。
PiKVM
幸いなことに、サーバーにはPiKVMが接続されていました。これはコンピューターへのリモートアクセスとリモート管理を可能にするデバイスです。PiKVMは基本的にアドオン(「帽子」、英語でhat)で、RaspberryPiに接続します。その後、PiKVMをモニターとキーボード/マウスの代わりにコンピューターに接続します。この場合、PiKVMは仮想モニター、仮想キーボード、マウス、CD、USBキーなどを表します。これを通じて、コンピューターまたはサーバーをリモートで管理できます(BIOSにもアクセスでき、仮想的に電源ボタンまたはリセットボタンを押すことができます)。すべてWebブラウザを通じて行われます。ソフトウェアは完全にオープンソースで、KVMスイッチへの接続もサポートしており、複数のコンピューターをリモートで管理できます。これはデータセンターへの展開に理想的です。
とにかく、サーバーがしばらく応答していなかったので、PiKVMに接続して実際に何が起こったのかを確認しました。そして、起こったのは…大惨事でした。
問題
サーバーは再起動後にinitramfsで停止しました。ああああ!画面の下には、システムが最終的に停止する前の最後の警告がありました:ALERT! ZFS=rpool/ROOT/debian does not exists. Dropping to a shell!。絶望の中で、「s」を見落とし、「hell」と読んでしまいました…
その時点で、サーバーのルートパーティションにもちろんZFSファイルシステム(暗号化された)がインストールされていたことを思い出しました。アップグレード中にもちろん忘れて、ZFSを有効にするカーネルモジュールを手動で有効にしませんでした。さらに悪いことに、サーバーはいくつかの仮想サーバーを実行していました(実行しなくなりました)。これらはすべて現在アクセス不可能でした。
注:ZFS(Zettabyte File System)は、信頼性、スケーラビリティ、エラー検出と修正の高度なテクニック(データが常に一貫性があり破損しないことを保証)、圧縮と重複排除などで知られている高度なファイルシステムです。つまり、サーバー環境に理想的です。
では、問題が何かはわかりました。でも、どのように解決するのでしょう?
その解決策
ショックから少し回復するために、まず濃いコーヒーを準備しました。この決定は戦略的で証明されました。システムの修復は夜遅くまで(そして次の午前中まで)続きました。
短い思考の後、次のような計画が私の頭に浮かびました。まず、「ライブDebian CD」からシステムを起動し、この一時システムにZFSサポートをインストールし、ZFSディスクを接続し、古いシステムに「chroot」し、そこで発生した損傷を修復し、すべてを再度起動します。そしてそれで完了です!
この時点で、古い映画ではただ馬に乗って日没に向かって走り去るだけですが、実際のところ、馬(とその鞍)への道は…かなりのトゲがありました。順番に進みましょう。
まず、debian-live-12.6.0-amd64-standard.isoファイルをPiKVMに転送し、仮想CDとして接続し、サーバーを起動しました。これは本当に簡単で、PiKVMは再びそのお金の価値があることが証明されました。
しかし、すでに最初から、サーバーはアメリカンキーボード配置のみを認識していることが判明しました。スロベニア語キーボードを使用しているため、必要な特定の特殊文字を入力するために押す必要があるキーを最初に理解する必要がありました。さて、ここは私の場合にスロベニア語キーボード上で最も一般的に使用される文字とアメリカンキーボード上での「翻訳」です:
トンネルの光
次のステップは、「ライブシステム」の/etc/apt/sources.listにcontribリポジトリを追加することでした。その後、ZFSサポートをインストールできました:sudo apt update && sudo apt install linux-headers-amd64 zfsutils-linux zfs-dkms zfs-zed。
1分か2分後、ZFSカーネルモジュールを読み込むことができました:sudo modprobe zfs。zfs versionコマンドは、ZFSサポートが機能していることを表示しました:
zfs-2.1.11-1
zfs-kmod-2.1.11-1
さて、最初のステップは成功しました。今度はシステムに既存のディスクを「接続」するだけです。まず、ディスクを接続するための適切なフォルダを作成しました:sudo mkdir /sysroot。
その後、「rpool」ZFSを接続しようとしました。以下のコマンドは単なる概算です(mountpointなどの設定をする必要があるかもしれません)が、同様の問題を抱えている人へのガイドになる可能性があります。もちろん、完全に簡単ではなく、最終的に目標に到達するためにはかなりの試行錯誤が必要でした。
sudo zpool import -N -R /sysroot rpool -f
sudo zpool status
sudo zpool list
sudo zfs get mountpoint
この時点で、暗号化パスフレーズを入力しました:sudo zfs load-key rpool…そして、ZFSがロック解除されたことを確認しました:sudo zfs get encryption,keystatus。
では接続します:sudo zfs mount rpool/ROOT/debian。そして見よ、データが表示されました。見た限りでは何も失われていませんでした!
「患者」の復活…
最後に、古いシステムへのchrootが続きました:
sudo mkdir /sysroot/mnt
sudo mkdir /sysroot/mnt/dev
sudo mkdir /sysroot/mnt/proc
sudo mkdir /sysroot/mnt/sys
sudo mkdir /sysroot/mnt/run
sudo mount -t tmpfs tmpfs /sysroot/mnt/run
sudo mkdir /sysroot/mnt/run/lock
sudo mount --make-private --rbind /dev /sysroot/mnt/dev
sudo mount --make-private --rbind /proc /sysroot/mnt/proc
sudo mount --make-private --rbind /sys /sysroot/mnt/sys
sudo chroot /sysroot/mnt /usr/bin/env DISK=$DISK bash --login
今、私は古い(「破損した」)システムに正常に接続されました。まず、ZFSサポートをインストールする必要がありました:
apt install --yes dpkg-dev linux-headers-generic linux-image-generic
apt install --yes zfs-initramfs
echo REMAKE_INITRD=yes > /etc/dkms/zfs.conf
…小さな問題で
もちろん、別のエラーが発生しました。つまり、systemdパッケージが破損しているため、ソフトウェアのインストールができませんでした。これは以下で解決しました:
sudo rm /var/lib/dpkg/info/systemd*
sudo dpkg --configure -D 777 systemd
sudo apt -f install
その後、未解決の依存関係が現れました…正確にそれを解決する方法は覚えていません。以下のコマンドが役に立ちました(必ずこの順序ではありません):
dpkg --force-all --configure -a
apt --fix-broken install
apt-get -f install
その後、efiパーティションを接続する必要がありました(最初にそれがどこにあるかを確認する必要がありました):
cp -r /boot /tmp
zpool import -a
lsblk
mount /dev/nvme0n1p2 /boot/efi
cd /tmp
cp * /boot/
今、本当に!
最終的に、ZFSカーネルモジュールをOSカーネルに追加するコマンドを実行できました:
update-initramfs -c -k all
dkms autoinstall
dkms-status
update-grub
grub-install
さて、最後にシステムが再起動し、その後、ZFSシステムのマウントポイントを修正する必要がありました(zfs set mountpoint=/ rpool/ROOT/debian)…別の再起動。古いシステムは死者から立ち上がりました。
事後の発生した損傷の修復
激しい変更と完全ではないアップグレードのため、欠落しているソフトウェアパッケージをインストールし、いくつかのsystemdパッケージを再インストールし、古いOSカーネルを削除する必要がありました。もちろん、すべて手動で。
ああ、更新時にSSHサーバーが何らかの理由で消えました。しかし、今、これを修正することは容易なことでした。
その後、rebootが続き、もう一度rebootが続き、すべてが本当に機能するかどうかを確認しました。
終わりよければすべてよし
そして今、それは機能しています。ああ、どのように素晴らしく機能するのでしょう!ZFSは暗号化されており、システムは復号化パスフレーズの入力後にうまく起動し、仮想サーバーも自動的に起動します。PiKVMは私の心で特別な場所を得ました。
では、次までのこと、またはどのように彼らが言うか!:)
P. S. また、Jureの助けをありがとうございます。彼のアドバイスがなければ、すべてがはるかに長くかかっていたでしょう。
翻訳元: https://telefoncek.si/2024/05/2024-07-16-resevanje-zfs/

