ReaR (Relax-and-Recover)って、ターゲットとなるのはRHEL系ディストリビューションのイメージが強いのだけれど、ReaR自体はOSSのバックアップ・リストアツールだし、他のディストリビューションではどうなんだろう… ってことでUbuntu Server 24.04 LTSで試してみることにしました。
エラーに対する対処方法についても記載しています。
ReaRをインストールしよう
システムにReaR(Relax-and-Recover)がインストールされていなかったら、インストールを行いましょう。Ubuntuではaptコマンドを以下の通り実行することでインストールすることができます。
# apt -y install rear
もし、NFSの共有ファイルシステムにバックアップを保存する場合には、NFSクライアントのパッケージもインストールしておきましょう。PXEを利用したリカバリーを行う場合においても、NFSクライアントは必要となります。
# apt -y install nfs-common
ISOイメージにバックアップする
RHELにおけるReaRのテストでも最初に行ったように、
システム全体のバックアップをISOイメージで作成して、DVDにバックアップしておきたい。リカバリするときは、そのDVDから起動して簡単にリカバリしたい。
という考えの基で、ISOイメージにバックアップすることを試してみます。
ReaRの設定ファイル /etc/rear/local.conf を以下の通り定義します。
OUTPUT=ISO
OUTPUT_URL=null
BACKUP=NETFS
BACKUP_URL=iso:///backup
バックアップ、でもエラー…
いつも通り、以下のコマンドでバックアップを実行します。
# rear -v mkbackup
すると2つのエラーが発生しました。
Copying all kernel modules in /lib/modules/6.8.0-31-generic (MODULES contains 'all_modules') Failed to copy all contents of /lib/modules/6.8.0-31-generic (dangling symlinks could be a reason) Copying all files in /lib*/firmware/ Testing that the recovery system in /var/tmp/rear.5F1ZsiyMlTjcTKf/rootfs contains a usable system /usr/lib/x86_64-linux-gnu/systemd/libsystemd-core-255.so requires additional libraries libsystemd-shared-255.so => not found
いずれも、バックアップ本体(backup.tar.gz)の作成プロセスではなく、リカバリー/レスキューシステムを作成するプロセスの中で発生したものです。
libsystemd-shared-255.so => not found のエラー
ReaRのgithubにこのエラーに関する記事がありました。
https://github.com/rear/rear/issues/3021
この記事の対処方法のひとつとして 環境変数 LD_PRELOAD にこのライブラリ(シェアードオブジェクト) に /usr/lib/x86_64-linux-gnu/systemd/libsystemd-shared-255.so を指定するという方法がありましたので、それでバックアップを再度試してみます。
# export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/systemd/libsystemd-shared-255.so
# rear -v mkbackup
これで libsystemd-shared-255.so => not found のエラーは解消することができました。
Failed to copy all contents of /lib/modules/6.8.0-31-generic (dangling symlinks could be a reason) のエラー
ReaRのgithubに類似のエラーに関する記事がありました。
https://github.com/rear/rear/issues/2739
ReaRはレスキューシステムの作成のために必要なファイルを/tmp/配下の一時ディレクトリにコピーをするのですが、シンボリックリンクをシンボリックリンクとしてではなく実ファイルとしてコピーしています。このエラーメッセージを表示しているのは /usr/share/rear/build/GNU/Linux/400_copy_modules.sh なのですが、この中で cp コマンドを -L オプションを付けて実行しています(-Lオプションはシンボリックリンクを実ファイルとしてコピーするオプションです)。従って、シンボリックリンクの参照元が存在しないとエラーになるという訳です。
要するに、バックアップする元のシステムでリンク切れがあるのだと予想します。
この記事によれば、そもそも ReaR はシンボリックリンク切れを避けるために -L を追加したのだと言っています。
想像ですが、symlinkfile -> /path/realfile のようなリンク関係があるときに、symlinkfile をコピーした先の環境で /path/realfile が参照できないとシンボリックリンク切れが発生します。-L オプションでsymlinkfileをコピーすれば、/path/realfileの内容と同じ実ファイルが作成されるので、シンボリックリンク切れを回避できるという訳です。
一方で、symlinkfile -> /path/realfile のようなリンク関係において、もともと /path/realfile が存在しない場合は、-L オプション付きのcpコマンドはエラーになります(もちろん -Lオプション無しのcpコマンドはエラーになりません)。
そう考えると「どうすりゃいいんだよ」と言いたくなりますね(笑)。
githubの議論でも「シンボリックリンクをシンボリックリンクとしてコピーし、最後に実際に欠けているシンボリックリンクターゲットだけを追加するのが、実際にはよいだろう。」とか言っています、、ド正論。
シンボリックリンクの議論は、以下に場所を移して議論が継続しようとしていますが、Unfortunately closed で終わってます(笑)。
https://github.com/rear/rear/issues/2740
一応、マジメに原因を追求してみる…
/lib/modules/6.8.0-31-generic/ 配下のシンボリックリンクのコピーにおいて、リンク元が存在しない奴がいるのかどうかをツール作ってチェックしてみました。
/lib/modules/6.8.0-31-generic/ 配下には、リンク元が存在しないシンボリックリンクは存在しなかったのですが、
lrwxrwxrwx 1 root root 39 Apr 19 21:46 build -> /usr/src/linux-headers-6.8.0-31-generic
というシンボリックリンクがあって、これのリンク元 /usr/src/linux-headers-6.8.0-31-generic を更にチェックすると、以下の rust ってシンボリックリンクのリンク元 ../linux-lib-rust-6.8.0-31-generic/rust が存在しません。
lrwxrwxrwx 1 root root 39 Apr 19 21:46 /usr/src/linux-headers-6.8.0-31-generic/rust -> ../linux-lib-rust-6.8.0-31-generic/rust
コイツが原因かー!!
試しに、この悪しきリンク切れシンボリックリンク(dangling symlink) /usr/src/linux-headers-6.8.0-31-generic/rust を削除して、ReaRのバックアップを実行してみますと、見事にこのエラーはなくなりました(笑)。
コイツが原因かー!!
試しに、この悪しきリンク切れシンボリックリンク(dangling symlink) /usr/src/linux-headers-6.8.0-31-generic/rust を削除して、ReaRのバックアップを実行してみますと、見事にこのエラーはなくなりました(笑)。もちろん、これはテストですので、削除したシンボリックリンクは元に戻しておきます。
それでどうする?
このエラーは「もともとのシステムで、シンボリックリンクのリンク元が存在しないために、cp -L でコピーしようとしてエラーが発生している」ケースなので、
・エラーが発生して当たり前!!
・リンク元がないのだから修復しようがない!
と思っています、なので無視したいと思います。レスキューシステムを作成するプロセスでのエラーだから、レスキューシステムがちゃんと起動すればいいんじゃね、とも思っています。
一方で、バックアップ本体には、このような悪しきリンク切れシンボリックリンク(dangling symlink)もきちんと含まれていることを確認しておきたいと思います。
バックアップで作成したISOファイルを以下のようにマウントします。
# mount -t iso9660 -o loop /var/lib/rear/output/rear-baseu1.iso /media
ISOファイルの中に保存されているbackup.tar.gzの内容をリストして書き出します。
# tar ztvf /media/backup/backup.tar.gz > /tmp/rear-baseu1.list
書き出した内容をチェックすると、以下のようにちゃんとありましたね。。
lrwxrwxrwx root/root 0 2024-04-20 06:46 usr/src/linux-headers-6.8.0-31-generic/rust -> ../linux-lib-rust-6.8.0-31-generic/rust
結論: そういう訳で、Failed to copy all contents of /lib/modules/6.8.0-31-generic (dangling symlinks could be a reason) のエラーに対しては対処しません!!
ISOイメージからリカバリーする
前述の通り作成した rear-baseu1.iso をDVD-ROMに焼いて、そのDVD-ROMからレスキューシステムを起動します。一番上の「Relax-and-Recover (BIOS or UEFI without Secure Boot)」を選択して下さい。

レスキューシステムがちゃんと起動しました。root でログインします(パスワード不要です)。

dfで見ると、まだレスキューシステムのファイルシステムしか存在しません。
以下のコマンドでバックアップをリカバリーして下さい。
# rear recover

途中でyesの入力を求めてくるので「yes」を入力します(入力しなくても30秒で自動的にyesが入力されたことになります)。

「Running exit tasks」が表示されたらリカバリーは完了です。エラーも発生していないので、リカバリーは成功です。
そしたら、DVDを抜いて reboot しましょう。
新たに起動したUbuntuは、リカバリーされたシステムです。
ls -alで確認すると、例の「悪しきリンク切れシンボリックリンク(dangling symlink)」もリンク切れのままちゃんと残っています。

めでたしめでたし。
広告主へのリンク
このブログにおける関連リンク
OSのバックアップ・リストアツールReaR(1):ReaRを使ってみた
OSのバックアップ・リストアツールReaR(2):ReaRのオプション
OSのバックアップ・リストアツールReaR(3):USBフラッシュメモリを使ったバックアップ
OSのバックアップ・リストアツールReaR(4): PXEを利用したOSのクローン
OSのバックアップ・リストアツールReaR(6):UbuntuでReaR(PXE編)
OSのバックアップ・リストアツールReaR(7): ReaRのトラブルシューティング
OSのバックアップ・リストアツールReaR(8): ReaRのcronは削除しよう
OSのバックアップ・リストアツールReaR(9): COPY_AS_ISって何?
OSのバックアップ・リストアツールReaR(10): ReaRの仕組みを理解する
OSのバックアップ・リストアツールReaR(11): バックアップ対象外の指定
Ubuntu Server 24.04 LTS をインストールする



コメント