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 }

관련 정보