Linux가 initramfs를 최종 루트 파일 시스템으로 처리하도록 하는 방법이 있습니까?

Linux가 initramfs를 최종 루트 파일 시스템으로 처리하도록 하는 방법이 있습니까?

드라이버를 로드하는 데 사용되는 임시 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

원천:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c?id=c69e3c3a0c014e86750e78b7e2ae823f7a9b2cb2#n535

이 경우 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입니다. 모든 것이 잘 작동하는 것 같습니다.

관련 정보