initrdにX11ライブラリを含める

initrdにX11ライブラリを含める

私はTS412(QNAP)でDebian Bookwormを実行しています。これはカーネルとinitrdをフラッシュメモリに保存します。合計16MBのフラッシュメモリを持っています。したがって、MDパーティションのサイズを変更した後でも取得できる最大サイズは12MB initrdでした。 xz圧縮を使用しています。しかし、それにもかかわらず、元のinitrdは12.5MBでした。一般的な解決策はモジュールを減らすことですが、実際の問題ではありません。

2984    .../usr/lib/modules
6036    .../usr/share
18824   .../usr/lib/arm-linux-gnueabi

arm-linux-gnueabiを見ると、libX11のような機能があります。このシステムにはコンソールもなく(シリアルラインを取得するのも困難です)、確かに「X」は必要ありません。

だから私は実際にする必要があるよりも多くのパッケージ(apt-get Remove ...)を完全に削除しました。しかし、その結果は起動し、正しく実行されるはるかに小さいinitrd(約5MB IIRC)です。

問題は、ボックスにsshを実行してemacs(1)を実行すると、GUIバージョンを通常のデスクトップ(多くのメモリ、大きなモニタなどを含む)に再投影するのが良いことです。ただし、これを行うには、次のものをインストールする必要があります。 TS412のXクライアントライブラリ。

これで、Xクライアントライブラリと一緒にパッケージをインストールしたため、起動中に不要な場合にinitrdにコピーを保存する理由を理解できません。モジュール(犯人ではない)だけでなく、他のものがinitrdに入らないように制限する方法はありますか?

initrdの制限に関するガイドラインをドキュメントで検索してみました。

答え1

起動中にグラフィック情報を表示するように設計されたバイナリがある可能性があります。これは依存ライブラリを取得します。ファイルシステムの初期化文書。

armel以下を含むほとんどのアーキテクチャには、これらのバイナリがあります。label.soplymouth-labelプラグインとしてプリマス起動中にテキストを含むグラフィック表示があります。このプラグインはレンダリングにさまざまなX11ライブラリを使用します。テキスト。このプラグインが追加されるとファイルシステムの初期化また、起動段階で使用できるように依存するすべてのライブラリを追加します。これはパッケージの依存関係plymouth-labelによって知られています。libcairo2それ自体は、以下を含むさまざまなX11ライブラリパッケージに依存しています。libx11-6 ライブラリの提供libX11.so.6

追加されたinitramfsフックlabel.soは次のとおりです。/usr/share/initramfs-tools/hooks/plymouth:

PLUGIN_PATH="$(plymouth --get-splash-plugin-path)"

case "${THEME_NAME}" in
  text|details|tribar)
      PLUGINS="text.so details.so"
      ;;
  *)
      PLUGINS="text.so details.so label.so"
      ;;
esac

[...]

for PLUGIN in ${PLUGINS}
do
  if [ -f ${PLUGIN_PATH}/${PLUGIN} ]
  then
      copy_exec ${PLUGIN_PATH}/${PLUGIN}
  else
[...]

copy_execinitramfs-tools-coreバイナリをコピーするだけでなく、必要な項目に応じて必要に応じて依存関係を抽出するシェル機能(付属)ですldd

したがって、Plymouthがテキスト以外の設定を使用している場合にのみ引っ張られ、テキストが表示されます。

QNAPの主な目的は映像ではないので、プリマスインストール、特にこのプラグインは避け、X11ライブラリをインポートする必要があります。ファイルシステムの初期化文書。

この行動の他の理由はありません。同様の理由で、この動作を引き起こす他の同様のパッケージがある可能性があります。

答え2

@ABの有用な答えロジックに従います。依存関係ツリーを追跡するのに役立ついくつかの迅速で汚れたスクリプトを削除しました。 (ABの答えはまだ特定の質問に対する答えです)

graeme@qnap412u:/tmp/myinitrd$ xzcat /boot/initrd.img-6.1.0-13-marvell  | cpio -i
34382 blocks

graeme@qnap412u:/tmp/myinitrd$ ~/bin/genxrefs.sh /tmp/myinitrd/  > /tmp/refs
Doing /tmp/myinitrd/usr/lib/klibc-tUxlTFMpGlp_BpS5UnpMpyc8b3g.so
    not a dynamic executable
Doing /tmp/myinitrd/usr/lib/arm-linux-gnueabi/ld-linux.so.3
Doing /tmp/myinitrd/usr/lib/arm-linux-gnueabi/libkmod.so.2.4.0
..elided..

graeme@qnap412u:/tmp/myinitrd$ ~/bin/whoneeds.awk  libudev /tmp/refs 
libudev.so.1 is used by /tmp/myinitrd/usr/lib/arm-linux-gnueabi/libdevmapper.so.1.02.1

graeme@qnap412u:/tmp/myinitrd$ ~/bin/whoneeds.awk devmapper  /tmp/refs 
graeme@qnap412u:/tmp/myinitrd$ ~/bin/whoneeds.awk libatomic  /tmp/refs 
libatomic.so.1 is used by /tmp/myinitrd/usr/lib/arm-linux-gnueabi/libkmod.so.2.4.0
libatomic.so.1 is used by /tmp/myinitrd/usr/lib/arm-linux-gnueabi/libcrypto.so.3


graeme@qnap412u:/tmp/myinitrd$ cat ~/bin/genxrefs.sh
#! /bin/bash -ue

# This will fail if any names uses spaces or commas (at a pinch, we could use TAB)

INITDIR=$1

objs=$(find ${INITDIR} -type f -name '*.so.*' -o -path '*.so')

# This is going to mess up if anybody uses spaces in pathnames
for obj in ${objs}
do
    echo "Doing ${obj}" >&2
    ldd ${obj} | while read line
    do
    requires=${line%% =>*}
    requires=${requires%% *} # 1st word
    requires=$(basename ${requires})
    
    provided=${line#*=>}

    # Ugly , we use commas because, for example quoted strings are too hard in awk(1)
    
    echo "${obj},${requires},${provided}"
    done  
done
graeme@qnap412u:/tmp/myinitrd$ cat ~/bin/whoneeds.awk
#! /usr/bin/awk -f
BEGIN {
    # NB this version of awk does not appear to understand FPAT
    FS=","

    STRING=ARGV[1]
    ARGV[1]=""
}

{ if ( index($2, STRING) > 0 )
    print $2 " is used by " $1 }

関連情報