![Linux가 initramfs를 최종 루트 파일 시스템으로 처리하도록 하는 방법이 있습니까?](https://linux55.com/image/74843/Linux%EA%B0%80%20initramfs%EB%A5%BC%20%EC%B5%9C%EC%A2%85%20%EB%A3%A8%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%20%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9C%BC%EB%A1%9C%20%EC%B2%98%EB%A6%AC%ED%95%98%EB%8F%84%EB%A1%9D%20%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
드라이버를 로드하는 데 사용되는 임시 initramfs가 아닌 실제 최종 파일 시스템인 initramfs를 사용하여 시스템을 부팅하고 싶습니다. 불행하게도 Linux에서는 initramfs를 사용할 때 최소한 다음과 같은 차이점을 포함하여 다른(내 경우에는 바람직하지 않은) 동작을 적용합니다.
- devtmpfs는 적어도 처음에는 자동으로 설치되지 않는다가 나중에 어느 시점에 자동으로 설치되는 것 같은데 알 수는 없습니다.
- 커널은
/sbin/init
.init=
/init
나는 initramfs에 추가 쓰레기를 놓으면 이러한 문제가 해결될 수 있다는 것을 알고 있지만 오히려 일반 루트 fs처럼 작동하고 싶습니다. 이것을 달성할 수 있는 방법이 있나요?
이 문제를 해결하기 위해 initramfs에서 사용자 공간 스크립트를 사용해야 한다면 적어도 devtmpfs의 자동 마운트를 유발하는 요인이 무엇인지 알고 싶습니다.
답변1
CONFIG_BLOCK
정의되지 않은 경우 다음과 같이 커널이 initramfs에서 실행에 실패한 후 실행되는 에 init/do_mounts.c
포함 되어 있기 때문에 가능합니다 .mount_root
/init
#ifdef CONFIG_BLOCK
{
int err = create_dev("/dev/root", ROOT_DEV);
if (err < 0)
pr_emerg("Failed to create /dev/root: %d\n", err);
mount_block_root("/dev/root", root_mountflags);
}
#endif
이 경우 mount_root
성공하기 위해 어떤 조치도 필요하지 않으며 커널은 계속해서 initramfs를 적절한 루트 파일 시스템으로 처리합니다.
불행하게도 닫기는 CONFIG_BLOCK
대부분의 용도에 실용적이지 않습니다. 이것이 작동해야 한다고 믿게 만드는 것은 내가 사용하고 있는 특정 보드의 패치에서 조건이 다음으로 대체된다는 것입니다.
#if defined(CONFIG_BLOCK) && !defined(CONFIG_INITRAMFS_SOURCE)
root=initramfs
어떤 작업도 수행하지 않고 반환을 유발하는 지원을 추가하는 것이 더 나을 것입니다 mount_root
. 이는 간단한 한 줄 패치여야 합니다. 하지만 업스트림에서 허용되는지는 모르겠습니다.
답변2
좋아요, 너무 늦었지만 도움이 될만한 답변이 있습니다.
먼저 initramfs에 /dev/console을 포함해야 합니다. 이렇게 하면 sysinit 기능을 콘솔에 다시 보고할 수 있습니다(사용자 공간에서 인쇄하면 기본 디스플레이에 다시 나타납니다). 다음으로, busybox를 init 프로세스로 사용하는 경우 RFS 루트 디렉터리에 있는 busybox(init라는 이름)에 대한 심볼릭 링크를 추가합니다. 문제는 Linux 커널 파일 시스템 계층이 몇 년 전에 변경되었다는 것입니다. 처음에는 /init를 사용하여 시스템을 시작해야 합니다. 이는 보안 허점으로 간주되어 /sbin/init로 재배치되었습니다. 나중에 IIRC에서는 linuxrc가 되었지만 지금은 모두 함께 제거되었다고 생각합니다.
내 inittab에서 처음 두 줄은 mount proc 및 mount devtmpfs입니다. 모든 것이 잘 작동하는 것 같습니다.