ルート(/)をoverlayfsとしてマウントしようとしています。
OSはNFSを介してRAMで起動しています。 initrdにpremountスクリプトを追加しました。これにより、「work」、「upper」、および「lower」ディレクトリが作成されます。
ブートプロセス中に、NFSの内容を「下位」ディレクトリにコピーしています。その後、overlayfsが$ {rootmnt}にマウントされます。
最後に、initスクリプトは$ {rootmnt}にchrootし(次に、実際のルートからの初期化など)、OSは正常に動作します。
当然、「仕事」と「上」のディレクトリは表示されません。これどうやってするの? initrdで何を変更する必要がありますか?
ルートをoverlayfsとしてマウントするという課題が解決されました。
簡単に言えば、「下位」、「作業」、および「上位」ディレクトリを「マージ」ディレクトリに移動する必要があります。ただし、次の点を考慮する必要があります。
1)「下位」ディレクトリがディスクイメージとして存在する場合は、何もする必要はありません。取り付けるだけ。そうでない場合は、作成します tmpfs その上にポイントをマウントし、NFS経由で必要なすべてのファイルをコピーします。
2)「上位」および「下位」ディレクトリは、1つのファイルシステムに配置する必要があります。別のものを作成する tmpfs マウントポイント、つまり「上位」および「下位」ディレクトリを配置するだけで十分です。
3)initrd.img
にNFSおよびOverlayfs用のモジュールがあることを確認します。それらが存在しない場合は、/ etc/initramfs-tools/modulesに追加します。
4)initrd.img
に「mount」コマンドの完全版があることを確認してください。存在しない場合は、/etc/initramfs-tools/hooks
のフックに追加します。
たとえば(一部の詳細は省略されています):
/etc/initramfs-tools/hooks/mount_full:
#!/bin/sh
PREREQ="/bin/mount"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
# Begin real processing below this line
copy_exec /bin/mount /bin/mount_full
exit 0
最後に、プレマウントスクリプトを/etc/initramfs-tools/scripts/init-premount/
に追加します。例えば:
/etc/initramfs-tools/scripts/init-premount/ramboot:
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /scripts/functions
# Begin real processing below this line
# Preparing work dirs
mkdir /overlaytmp
mkdir /overlaytmp/lower
mkdir /overlaytmp/upper_and_work
mkdir /overlaytmp/merge
mkdir /ramboottmp
# Preparing RAM disks and thus layers
mount -t tmpfs -o size=100% none /overlaytmp/lower
mount -t tmpfs -o size=100% none /overlaytmp/upper_and_work
mkdir /overlaytmp/upper_and_work/upper
mkdir /overlaytmp/upper_and_work/work
...
mount nfs_share /ramboottmp
...
# Copy root content over NFS to RAM
echo "Copying / to RAM ..."
cp -rfa /ramboottmp/* /overlaytmp/lower
# Preparing layers mount points
mkdir /overlaytmp/lower/mnt/lower
mkdir /overlaytmp/lower/mnt/upper_and_work
# Lower layer will be read-only
mount -o remount,ro /overlaytmp/lower
# Mounting overlayfs
mount -t overlay -olowerdir=/overlaytmp/lower,upperdir=/overlaytmp/upper_and_work/upper,workdir=/overlaytmp/upper_and_work/work none /overlaytmp/merge
# Moving layers to merge layer
mount --move /overlaytmp/lower /overlaytmp/merge/mnt/lower
mount --move /overlaytmp/upper_and_work /overlaytmp/merge/mnt/upper_and_work
# Moving merge layer to finally root
mount --move /overlaytmp/merge ${rootmnt}
umount /ramboottmp