이를 통해 등 ls -l
다양한 장치를 발견하게 되었습니다 . 나는 출력을 주의 깊게 살펴보았는데 (예를 들어)ram0
ram1
brw------- 1 root root 1, 3 Jan 6 11:34 /dev/ram3
crw-rw-rw- 1 root root 1, 3 Jul 15 1970 /dev/null
음, 장치 유형(블록 및 문자)에 따라서만 다릅니다. 읽고 쓰기를 시도했지만 ram3
놀랍게도 8MiB의 0바이트 청크를 읽을 수 있었고 8MiB 이상의 데이터를 쓸 수 없었습니다. 왜냐하면 읽고 쓰는 동안 EOF가 즉시 수신되고 무제한 쓰기가 가능하다고 생각했기 때문입니다. 그것은 만들어질 수 있다.
그런 다음 다른 사람들도 시도했지만 ram
더 놀랍게도 그들은 모두 똑같이 행동했습니다. do처럼 임의의 항목을 생성 /dev/ram8
하지 않고 "디스크 가득 참"을 보고 하지 않습니다 ./dev/random
/dev/ram7
/dev/full
mknod
그런 다음 작업 디렉터리(마운트 유형: ext4)의 모든 항목을 시도 했지만 결과는 동일했습니다. 문자 장치는 /dev/null,full,zero,random
블록 장치와 동일하게 작동합니다./dev/ramX
그래서 나는 이렇게 생각하기 시작했습니다.
- 동일한 기기번호와 어떻게 다른가요
/dev/ramX
?/dev/<device>
- 이러한 블록 장치 읽기에 대한 8MiB 빈 콘텐츠(모두 0) 및 8MiB 쓰기 제한을 설명하는 방법은 무엇입니까?
나는 그 대답이 모든 Linux 커널 시스템에 적용되어야 한다고 생각합니다.
(참고: 8MB = 8,000,000바이트, 8MiB = 8,388,608바이트)
답변1
블록 장치는 문자 장치와 완전히 별개입니다. 장치 주/부 번호가 동일하다는 사실은 전혀 의미가 없습니다. 블록/문자 장치 비트를 장치 번호의 추가 최상위 비트로 생각할 수 있습니다.
개념적으로 장치 번호는 커널의 대규모 장치 테이블에 대한 색인입니다. 역사적으로 문자 장치용 테이블과 블록 장치용 테이블이 하나씩 있었습니다. 내 생각에 Linus Torvalds는 이 분할이 단지 역사적인 인공물일 뿐이라고 생각하고 결국에는 블록/문자 장치 비트를 장치 번호에 대한 추가 이진 숫자로 처리하기를 원할 수도 있습니다. 그러나 현재 일부 오래된 소프트웨어에서는 모든 Unix 계열 시스템에 블록 장치와 문자 장치가 있고 그 성격이 근본적으로 다르다고 가정하므로 이 오래된 디자인의 일부 유사성은 그대로 유지됩니다.
이러한 장치는 컴파일 타임 옵션을 /dev/ram*
사용하여 커널 구성에 정의됩니다 .CONFIG_BLK_DEV_RAM*
- CONFIG_BLK_DEV_RAM은 이러한 장치가 커널에 내장되었는지, 모듈로 컴파일되었는지(
brd.ko
) 또는 완전히 생략되었는지를 결정합니다. 데비안 9에는 이를 모듈로 가지고 있습니다. - CONFIG_BLK_DEV_RAM_COUNT는 생성할 /dev/ram* 장치 수를 결정합니다. 커널 "공장 기본값"은 16개 장치입니다.
- CONFIG_BLK_DEV_RAM_SIZE는 각 /dev/ram* 장치의 크기를 정의합니다. 커널 "공장 기본값"은 장치당 4MiB이고 Debian 9는 16MiB를 사용합니다. 귀하의 배포판은 분명히 8MiB를 사용합니다.
/dev/ram*
RAM 디스크 드라이버가 커널 모듈로 컴파일되면 모듈 매개변수를 통해 장치의 수와 크기를 수정할 수 있습니다.
이러한 /dev/ram*
장치는 Linux 설치 프로그램 등에서 자주 사용되므로 실제 디스크를 사용할 수 없을 때 일반 시스템과 상당히 유사한 것을 설정할 수 있습니다.
RAM 기반 블록 장치이므로 일반적으로 디스크처럼 작동합니다. 크기가 제한되어 있으며 파일 시스템을 만들 수 있습니다. 여기에 파티션 테이블을 생성할 수 있지만 RAM 디스크 파티션에는 표준 장치 번호가 할당되지 않습니다. RAM 디스크를 분할해야 하는 경우 kpartx
다음 명령을 사용하여 이 문제를 쉽게 해결할 수 있습니다. 결과적으로 분할된 장치의 /dev/ramX
이름은 일반적으로 입니다 /dev/mapper/ramXpY
. 분명히 /dev/ram*
장치에 저장한 모든 항목은 재부팅이나 정전 또는 모듈이 작동하지 않을 때 손실됩니다. 제거된 시간 brd.ko
(해당되는 경우)
내 생각에 일부 배포판(과거?)에서는 /dev/ram*
initramfs/initrd를 생성할 때 이러한 장치를 사용한 것 같습니다. (새 커널 패키지가 설치될 때마다 일반적으로 새 initramfs 파일이 자동으로 생성됩니다. initramfs 파일에는 시스템에 특정한 여러 설정이 포함되어야 하기 때문에 미리 패키지할 수 없습니다.)