해당 특수 장치로 /dev/ramX를 사용하시겠습니까?

해당 특수 장치로 /dev/ramX를 사용하시겠습니까?

이를 통해 등 ls -l다양한 장치를 발견하게 되었습니다 . 나는 출력을 주의 깊게 살펴보았는데 (예를 들어)ram0ram1

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 파일에는 시스템에 특정한 여러 설정이 포함되어야 하기 때문에 미리 패키지할 수 없습니다.)

관련 정보