overlayfs를 사용할 때 루트를 전환한 후 initramfs 램을 해제하시겠습니까?

overlayfs를 사용할 때 루트를 전환한 후 initramfs 램을 해제하시겠습니까?

저는 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의 실제 실행 파일 크기를 더한 값의 약 두 배입니다.rowork/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_rootinitramfs는 사전 설치된 경우를 제외하고는 메모리에서 지워지지 않습니다. 왜 이런 일이 일어나는지 모르겠습니다.

그래서 Arch Linux 부팅 ISO의 스크립트를 살펴본 결과 기본적으로 내가 생각했던 것과 유사한 작업을 수행하는 것으로 나타났습니다 . /run하지만 ./run

동일한 작업을 수행하도록 스크립트를 조정함으로써 궁극적으로 128MB RAM으로 부팅되는 ISO를 생성할 수 있었고 응용 프로그램에 80MB의 여유 RAM을 남겨둘 수 있었습니다. 좋은.

그래서 비결은마운트해야 할 것은 무엇이든 /run 아래에 마운트하세요., switch_root그러면 루트 파일 시스템이 제대로 지워져야 합니다.

관련 정보