저는 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.so
plymouth-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_exec
initramfs-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 }