이번 소개에서는파일 시스템 초기화Robert Landley는 ramfs의 동기로 다음을 언급했습니다.
그러나 가상 디스크는 실제로 캐싱으로 인해 더 많은 메모리를 낭비합니다. Linux는 블록 장치에서 읽거나 블록 장치에 쓴 모든 파일과 디렉터리 항목을 캐시하도록 설계되었으므로 Linux는 램디스크와 데이터를 "페이지 캐시"(파일 데이터용) 및 "디렉터리 항목 캐시"(디렉터리 항목용)로 복사합니다. ). 블록 장치로 가장하는 가상 디스크의 단점은 블록 장치로 취급된다는 것입니다.
몇 년 전, Linus Torvalds는 기발한 아이디어를 떠올렸습니다. Linux의 캐시를 파일 시스템처럼 마운트할 수 있다면 어떨까요? 파일을 캐시에 보관하고 파일이 삭제되거나 시스템이 다시 시작될 때까지 삭제하지 마십시오. Linus는 "ramfs"라는 캐시 주위에 작은 래퍼를 작성했으며 다른 커널 개발자는 "tmpfs"라는 향상된 버전을 만들었습니다(스왑 공간에 데이터를 기록하고 지정된 마운트 지점의 크기를 제한하여 사용 가능한 모든 것을 채울 수 있음). 사용 전 메모리). Initramfs는 tmpfs의 인스턴스입니다.
이로 인해 ramfs(및 initramfs)는 initramfs 드라이버를 사용하여 내부 캐시 구조를 파일 시스템으로 노출하는 메커니즘이라고 믿게 되었습니다.
하지만 캐시 자체의 존재는 캐시된 블록 장치의 존재에 달려 있지 않습니까?~에서? 이는 순전히 RAM 기반 파일 시스템을 생성하려면 ramfs
캐시에서 블록 장치를 생성(또는 에뮬레이트)해야 함을 의미합니다. 이는 원래 initrd에서 발생한 문제처럼 보입니다. 여기에 뭔가 빠진 것이 있다고 확신하지만 무엇인지 잘 모르겠습니다.
커널에 전달된 cpio 아카이브는 블록 장치(일반적으로 하드 드라이브)에 있을 수도 있는데, initramfs 콘텐츠를 마운트하려면 커널에 파일 시스템 드라이버가 여전히 필요합니까?
답변1
ramsfs/initrams의 경우 fs를 캐시하는 장치는 "비어 있습니다". 다음 설명을 보면 /Documentation/filesystems/ramfs-rootfs-initramfs.txt
:
일반적으로 모든 파일은 Linux에 의해 메모리에 캐시됩니다. 백업 저장소(일반적으로 파일 시스템이 마운트된 블록 장치)에서 읽은 데이터 페이지는 다시 필요할 경우를 대비해 유지되지만 가상 메모리 시스템에서 다른 용도로 메모리가 필요한 경우에는 정리(해제 가능)로 표시됩니다. 마찬가지로, 파일에 기록된 데이터는 백업 저장소에 기록되면 깨끗한 것으로 표시되지만 가상 머신이 메모리를 재할당할 때까지 캐싱 목적으로 유지됩니다. 유사한 메커니즘(카탈로그 항목 캐싱)을 사용하면 디렉토리에 대한 액세스 속도가 크게 향상됩니다.
ramfs에는 백업 저장소가 없습니다. ramfs에 기록된 파일에는 평소와 같이 디렉토리 항목과 페이지 캐시가 할당되지만 기록할 장소가 없습니다. 이는 이러한 페이지가 정리된 것으로 표시되지 않으므로 가상 머신이 메모리를 회수하려고 할 때 해제될 수 없음을 의미합니다.
따라서 "내부 캐시 구조를 파일 시스템의 메커니즘으로 노출"하는 데는 아무런 문제가 없지만 제가 설명하는 것은 아닙니다. 일반적인 내부 캐시 구조를 사용하지만 "백업"할 장소가 없는 파일 시스템입니다(예:메모리 디스크있다) 그랬다.오직캐시에 존재하며 페이지를 무효화하고 다시 쓰는 메커니즘은 사용되지 않습니다.
cpio
문서 에 관해서는 다시 살펴보십시오 ramfs-rootfs-initramfs.txt
.
이전 initrd는 항상 별도의 파일인 반면, initramfs 아카이브는 Linux 커널 이미지에 연결되었습니다. (linux-*/usr 디렉토리는 빌드 프로세스 중에 이 아카이브를 생성하는 데 특별히 사용됩니다.)
따라서 cpio
블록 장치, 네트워크, 비둘기 벡터 또는 다른 방법을 통해 커널을 로드하는 것과 동일한 방법을 사용하여 로드하십시오. 그것은 중요하지 않습니다. 부트로더가 이를 처리하므로 커널에는 파일 시스템 드라이버가 필요하지 않습니다.
답변2
ramfs의 요점은 블록 장치를 제거한다는 것입니다. 파일 시스템의 내용은 파일 시스템 인터페이스를 통해 채워지며, 블록 장치를 지원하지 않으므로 데이터는 캐시에 남아 있습니다. 이전 방식에서는 백업 저장소가 파일 시스템 이미지가 기록되는 블록 장치 역할을 했습니다. 그런 다음 파일 시스템으로 마운트합니다. 이 접근 방식의 문제(RAM이 RAM에 캐시됨)는 캐시를 제거하는 것이 아니라 블록 장치를 제거하여 해결되었습니다.
예, cpio
아카이브는 일반적으로 블록 장치에서 생성되지만 반드시 그런 것은 아닙니다. 네트워크, 원시 블록 장치 등에서 올 수 있습니다. cpio 아카이브는 선택적으로 커널 이미지의 일부가 될 수도 있습니다. 물론 부트로더에는 커널과 initramfs를 RAM에 로드하는 메커니즘이 있어야 하지만 이는 커널이 아닌 부트로더의 문제입니다. initramfs의 요점은 선택할 수 있는 12가지 파일 시스템, 다양한 하위 수준 디스크 드라이브 인터페이스 등을 포함하여 결과 시스템이 매우 다양할 수 있다는 것입니다. initramfs를 사용하면 커널을 보다 일반적으로 구성할 수 있으므로 대신 모듈로 제공할 수 있는 백만 개의 드라이버를 컴파일할 필요가 없습니다. 실제로 커널에는 파일 시스템 드라이버가 필요하지 않으며 필요에 따라 모두 모듈로 로드할 수 있습니다.