デフォルトでは、systemdはわずかなエラーで緊急シェルにドロップします。たとえば、何らかの理由でfstabのマウントの1つが失敗した場合、システムはすぐに起動できなくなります。私は数十の多様な生産システムを管理していますが、この動作は非常に有害であることがわかりました。 (実際には、これは重大な設計の失敗だと思いますが、それは個人的な意見です)。
システムブートの復元力を増やしたいのですが。与えられたエラーによってコンソールへのログインが完全に不可能にならない限り、システムは常に起動し、欠落しているドライバーやマウントなどが緊急シェルをドロップしない(代わりに警告を表示する)のが最適です。何を実行できるか、それを実行する必要があります。
Systemdが/ etc/fstabから* .mountファイルを自動的に生成し、小さなx-systemd.deviceタイムアウトでnofailオプションを使用できることを知っています(または関連する.mountファイルを自分で定義します)。しかし、それは私の問題を解決しません。システムをより回復力のあるものにしたいので、毎回fstabを「パッチ」するのはあまり便利ではありません。一部の開発者は、それが十分に重要であると考えました。
ソートでは、マシンの制御を取り戻したいので、systemdに、ブートプロセスをクラッシュさせるほど深刻な問題を決定させないようにします。出来ますか?
文字通りマウントの失敗のみであり、変更する必要があるのはそれだけです。
したがって、あなたの要求の手紙は答えるのは簡単です。ドロップインファイルを作成します。
# /etc/systemd/system/local-fs.target.d/nofail.conf
# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=
これにより、linux sysvinitがこの部分的な障害シナリオを許可することですでに苦しんでいる問題以外に、新しい問題は追加されないと思います。
ただし、-long systemdが指定されたブロックデバイスが使用可能になるまで待機する方法の問題も指摘しました。全体としてfstabジェネレーターの代わりを提供しない限り、これを構成する方法はありません。 https://www.freedesktop.org/software/systemd/man/systemd.generator.html
ここであまり広く使用されていないコードを大量にダンプしても、システムの復元力が向上することはほとんどありません。最も近い解決策は、既存のfstabジェネレーターにパッチを適用することだと思います。それはそれほど複雑ではありません、あなたはそれを回避することができます/重要な変更に追いつくことができると思います。
技術的には、ディストリビューションに自己完結型のmountall
sysvinitスクリプトが含まれている場合、それをフックしてみることができます。ただし、ブートプロセスが大幅に変更されます。実際には、フォークのmoreです。そのアプローチはお勧めしません。
https://unix.stackexchange.com/a/393711/2948
ユニットファイルを検索する場合、ブートが
emergency.target
にフォールバックする方法はほとんどありません。これは通常、ローカルファイルシステムの.mount
ユニットが失敗し、local-fs.target
が失敗した場合に発生します。または、initramfsがsystemdを使用している場合、initramfsがルートファイルシステムのマウントに失敗した場合。
local-fs.target
にはOnFailure=emergency.target
があります。そして、ローカルファイルシステムのユニットがlocal-fs.targetのRequiredリストに自動的に追加されるため、失敗します(DefaultDependencies=no
がない場合)。$ systemctl show --property Requires local-fs.target Requires=-.mount home.mount boot.mount boot-efi.mount
/etc/fstab
エントリにnoauto
マウントオプションを追加して、ブート操作に不要なファイルシステムの自動マウントをオフにします。
/dev/sdxy /u01 nfs defaults 0 0
に:
/dev/sdyx /u01 nfs noauto 0 0
ブート後、/etc/rc.local
の行を使用してファイルシステムをマウントします。
mount /u01
この例ではNFSを使用していますが、ファイルサーバーからインポートされたLUNにも適用できます。
これを試してみませんか?
systemctl mask emergency.service
systemctl mask emergency.target