私の設定では、一部の/etc
ファイルを別のパーティションに配置する必要があります。このために、ソフトリンクを作成しました:
ls -li /etc/group
956 lrwxrwxrwx 1 root root 21 May 7 15:48 /etc/group -> /var/common/etc/group
ls -li /var/common/etc/group
3145744 -rw-r--r-- 1 root root 668 May 11 11:02 /var/common/etc/group
問題は、次のファイルを使用してコマンドを実行しようとするときです:
groupadd foo
groupadd: failure while writing changes to /etc/group
strace
レポート:
rename("/etc/group+", "/var/common/etc/group") = -1 EXDEV (Invalid cross-device link)
write(2, "groupadd: failure while writing "..., 54groupadd: failure while writing changes to /etc/group
) = 54
仕事に行くにはどうしたらいいか、何かアイデアはありますかgroupadd
?
答え1
/etc
このため、パーティション間でファイルを分割するのはお勧めできません。
何が起こっているかというと、groupadd
ユーティリティが一時ファイルを作成し、その後、/etc/groups
単純な操作によって実際のファイル (または、シンボリックリンクが指しているもの) を一時ファイルに置き換えているのですrename
。
問題は、rename()
同じファイルシステムでのみ機能し、それ以外の場合はエラーが発生することです。
ここで発生する可能性があるもう 1 つの潜在的な問題は、何かが を実行しようとするとrename
、シンボリック リンクが上書きされ、通常のファイルになってしまうことです。
もう 1 つの潜在的な問題は、/etc
システムが他のボリュームをマウントする前に、適切な起動に多くのファイルが必要になることです。そのため、これらのファイルは実際には欠落していることになります。
一言で言えば、これは修正できません。そして、そもそも修正すべきではありません。
答え2
/etc
ルートファイルシステム上に置くことを意図しています。そのようにしておくのが賢明です。
本当に分割する必要がある場合は/etc
、ユニオン マウントを使用すると、より良い結果が得られる可能性があります。ただし、コンポーネントの 1 つがマウント ポイントと一致するユニオン マウントを Linux がサポートするかどうかはわかりません。また、/etc
ルート ファイル システムの実際の部分をユニオン マウントの一部にしないようにすることは困難です。
のすべてを/etc
別のパーティションに配置する場合は、/etc
必要なものだけ ( /etc/fstab
、 init に必要なもの (/etc/inittab
または/etc/init
および/etc/rc*
または init システムが使用するもの)、最小限の/etc/passwd
および/etc/group
など) を含む最小限の を作成できます。起動の早い段階 ( よりずっと前!) で、を に/etc/rc.local
バインドマウントします。ただし、これを正しく行うには多くの作業が必要になり、全体が になることになり、おそらくこれは望ましくありません。この設定は、通常の init システムをまったく使用せず、ルート ファイル システムのサイズに厳しい制約がある一部の組み込みシステムで主に意味を持ちます。/var/common/etc
/etc
/var/common/etc
/etc
多数のサーバー間で共有される がある場合/var/common
、問題へのアプローチは異なります。適切な構成管理システムを使用して、共有ファイルを に展開します/etc
。
のようなファイルは/etc/passwd
、/etc/group
マシン間で共有しないでください。これらのファイルは、ローカル ユーザーとグループにのみ使用してください。マシン間で共有されるエントリの場合は、NIS または LDAP を使用してください。