overlayfsを使用するときにルートを切り替えた後、initramfs Ramを解放しますか?

overlayfsを使用するときにルートを切り替えた後、initramfs Ramを解放しますか?

私はArch Linuxに基づいてカスタムLive Linuxブートイメージを構築しています。次のことを行うカスタムスクリプトを含めるように Stock initrd を変更しました。

  • 起動後はinitramfsのみが存在します。まず、ブートメディアを見つけて/image
  • 次に、squashfsルートファイルシステムをループバックマウントすることによって/ro
  • その後、tmpfsをマウントし/rw、そのディレクトリ内にディレクトリを作成しましたdatawork
  • /ro最後に、下部、/rw/data上部、および/rw/work作業ディレクトリとして使用するoverlayfsをインストールしました。このoverlayfsを/new_root
  • switch_rootこれで、切り替えて/new_rootブートを続けることに慣れました。

このアプローチの問題は、システムの起動後もinitramfsの内容がRAMに残っていることです。

実際のルートに切り替えた後にinitramfsをメモリから削除できるようにプロセスを再処理する方法はありますか?これが重要な理由は、メモリ使用量(192MB)が小さいシステムでライブLinuxを起動しようとし、initrdのサイズ(initramfs-fallbackベース)がすべてのブート後には、空きRAMが約30MBしかありません。これに比べて、一般的なArch Linuxインストールは約18MBのRAMのみを使用します。これは、解凍されたinitramfs(約66 MB)がまだRAMにあり、使用量を確認できない別の66 MB程度のRAMもあることを示唆しています。 (おそらく、何らかの理由でinitramfsが実際にRAMに複製された可能性がありますか?)

明らかにinitramfsを減らすことができますが(パッケージに含める特定のモジュールを指定する方法を研究していますが)、メモリが不足しているシステムから起動した後はまだ多くのRAMを使用します。


/image編集:私は単にtmpfsをマウントし、その上にスクリプトをマウントするためにinitramfsを再設計しようとしましたrw。その後、スクリプトはマウントを実行し、Overlayfsをマウントします。結果はまったく同じです。 RAM使用量は、initramfsサイズにRAMの実際の実行可能ファイルサイズを加えた値の約2倍です。rowork/image/new_root

RAMはinitramfsのサイズのみを使用するプレインストールの中断を要求します。これは意味があります。その後、インストール後に休憩を要求し、RAMの使用量がシステムの起動で観察されたものの2倍であることがわかりました。したがって、さまざまなマウントの何かがRAM使用量を引き起こすようです。 initrdスクリプトにコマンドを追加してプロセスを追跡し、どのコマンドがメモリ使用量を引き起こすかを分離できることをfree確認します。sleep


もう一度編集してください。したがって、「デュアル」RAMの使用の原因はSquashFSです。したがって、ファイルシステムを再圧縮するには、lzmaの代わりにgzipを使用する必要があるようです。まあ、ミステリーの一部が解決されました。

しかし、これはまだルート切り替え後もinitramfsがRAMを使い続ける問題を解決しません。だからこれは謎のままです。

カーネルが内部的にinitramfsをアンマウントしようとしていますが、何かがインストールされているので、それを行うことができないのかどうか疑問に思います。しかし、それは言うことができません。なぜならあなたがそうするからです。いつもとにかく、ルートを切り替える前にinitramfsから何かをインストールしてください...

ベストアンサー1

私はあなたが「rootfs」を意味すると仮定します。いいえ、外れる方法はありません。カーネル文書には次のように具体的に言及されています。https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Rootfs は、2.6 システムに常に存在していた ramfs (またはアクティブな場合は tmpfs) の特別なインスタンスです。 rootfsをアンマウントできない理由は、initプロセスを終了できないのとほぼ同じです。空のリストを確認して処理するために特別なコードを使用する代わりに、カーネルは特定のリストが終了しないように小さく、簡単に保証できます。空になる。

ほとんどのシステムはrootfsに他のファイルシステムをマウントして無視します。 ramfsの空のインスタンスは非常に少量のスペースを占めています。

整理についても心配する必要はありませんrootfs。マニュアルを参照してくださいswitch_roothttp://man7.org/linux/man-pages/man8/switch_root.8.html

警告:switch_rootは、現在のルートファイルシステム上のすべてのファイルとディレクトリを繰り返し削除します。

また、カーネル文書に戻って参照された「rootfs」文書の下には、上記の2つのことを繰り返すもう1つの紹介があります。

  • 別のルートデバイスに切り替えるときは、initrdivov_rootを実行してRAMディスクを取り外します。しかし、initramfsはrootfsです。 ivot_root rootfsを使用またはマウント解除できません。代わりに、rootfsのすべてのエントリを削除してスペースを解放し(-xdev / -exec rm '{}' ';'を探す)、rootfsを新しいルートで上書きし(cd /newmount; mount --move . /; .), stdin /stdout/stderr 新しい /dev/console に接続し、新しい初期化を実行します。

    これは非常にトリッキーなプロセスであるため(コマンドを実行する前にコマンドを削除する必要があるため)、klibcパッケージにはこれらすべての操作を実行するヘルパープログラム(utils / run_init.c)が導入されました。他のほとんどのパッケージ(たとえば、busybox)は、このコマンドの名前を「switch_root」と指定しました。

おすすめ記事