저는 Arch Linux를 기반으로 사용자 정의 Live Linux 부팅 이미지를 구축 중입니다. 다음을 수행하는 사용자 정의 스크립트를 포함하도록 Stock initrd를 수정했습니다.
- 부팅 후에는 initramfs만 존재합니다. 먼저 부팅 미디어를 찾아서
/image
. - 그런 다음 squashfs 루트 파일 시스템을 루프백 마운트하여
/ro
. - 그런 다음 tmpfs를 마운트
/rw
하고 해당 디렉토리 내에 디렉토리를 만들었습니다data
.work
/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(약 66MB)가 여전히 RAM에 있고, 사용량을 확인할 수 없는 또 다른 66MB 정도의 RAM도 있음을 시사합니다. (어쩌면 어떤 이유로 initramfs가 실제로 RAM에 복제되었을 수도 있나요?)
분명히 initramfs를 줄일 수 있지만(패키지에 포함할 특정 모듈을 지정하는 방법을 연구 중입니다) 그래도 메모리가 부족한 시스템에서 부팅한 후에는 여전히 많은 RAM을 사용하게 됩니다.
/image
편집: 나는 단순히 tmpfs를 마운트한 다음 그 위에 스크립트를 마운트하기 위해 initramfs를 재설계하려고 했습니다 rw
. 그런 다음 스크립트는 마운트를 수행한 다음 Overlayfs를 마운트합니다. 결과는 정확히 동일합니다. RAM 사용량은 initramfs 크기에 RAM의 실제 실행 파일 크기를 더한 값의 약 두 배입니다.ro
work
/image
/new_root
RAM에서 initramfs의 크기만 사용되는 사전 설치 중단을 요청합니다. 이는 의미가 있습니다. 그런 다음 설치 후 휴식을 요청했고 RAM 사용량이 시스템 부팅에서 관찰한 것의 두 배라는 것을 발견했습니다. 따라서 다양한 마운트의 무언가가 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_root
.http://man7.org/linux/man-pages/man8/switch_root.8.html
경고: switch_root는 현재 루트 파일 시스템의 모든 파일과 디렉터리를 반복적으로 삭제합니다.
또한 커널 문서로 돌아가서 참조된 "rootfs" 문서 아래에는 위의 두 가지 사항을 반복하는 또 다른 소개가 있습니다.
다른 루트 장치로 전환할 때 initrdivov_root를 실행한 다음 램디스크를 제거합니다. 그러나 initramfs는 rootfs입니다. ivot_root rootfs를 사용하거나 마운트 해제할 수 없습니다. 대신, rootfs의 모든 항목을 삭제하여 공간을 확보하고(-xdev / -exec rm '{}' ';' 찾기), rootfs를 새 루트로 덮어쓰고(cd /newmount; mount --move . /; chroot .), stdin /stdout/stderr 새 /dev/console에 연결하고 새 초기화를 실행합니다.
이는 매우 까다로운 프로세스이므로(명령을 실행하기 전에 명령을 제거해야 함) klibc 패키지에는 이 모든 작업을 대신 수행하는 도우미 프로그램(utils/run_init.c)이 도입되었습니다. 대부분의 다른 패키지(예: busybox)는 이 명령의 이름을 "switch_root"로 지정했습니다.
답변2
따라서 어떤 이유로든 설치하면 문제가 되는 것 같습니다.아무것initramfs에서 /new_root
initramfs는 사전 설치된 경우를 제외하고는 메모리에서 지워지지 않습니다. 왜 이런 일이 일어나는지 모르겠습니다.
그래서 Arch Linux 부팅 ISO의 스크립트를 살펴본 결과 기본적으로 내가 생각했던 것과 유사한 작업을 수행하는 것으로 나타났습니다 . /run
하지만 ./run
동일한 작업을 수행하도록 스크립트를 조정함으로써 궁극적으로 128MB RAM으로 부팅되는 ISO를 생성할 수 있었고 응용 프로그램에 80MB의 여유 RAM을 남겨둘 수 있었습니다. 좋은.
그래서 비결은마운트해야 할 것은 무엇이든 /run 아래에 마운트하세요., switch_root
그러면 루트 파일 시스템이 제대로 지워져야 합니다.