우선은 /sys
A는 가상 파일 시스템 . 살펴보면 /proc/filesystems
, 몇 개가 nodev
앞에 있는 등록 된 파일 시스템 목록을 찾을 수 있습니다. 이는 의사 파일 시스템 임을 나타냅니다 . 이는 이들이 실행중인 커널에 RAM 기반 파일 시스템으로 존재 함을 의미합니다. 또한 블록 장치가 필요하지 않습니다.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
부팅시 커널은이 시스템을 마운트하고 적합한 경우 항목을 업데이트합니다. 예 : 새로운 하드웨어는 부팅시 또는 발견 될 때 udev
.
/etc/mtab
일반적으로 다음 을 통해 마운트를 찾습니다.
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
이 주제에 대한 좋은 논문은 Patric Mochel 's – sysfs Filesystem을 읽으십시오
.
/ sys 파일의 통계
아래 디렉토리에 들어가서 /sys
수행하면 ls -l
모든 파일의 크기가 하나임을 알 수 있습니다. 일반적으로 4096 바이트 에 의해보고됩니다 sysfs
.
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
또한 stat
파일에 대한 작업을 수행하고 다른 고유 기능을 확인할 수 있습니다. 0 블록을 차지합니다. 또한 루트의 inode (stat / sys)는 1입니다. /stat/fs
일반적으로 inode 2가 있습니다.
rsync 대 cp
의사 파일 동기화의 rsync 실패에 대한 가장 쉬운 설명은 예입니다.
이름 address
이 18 바이트 인 파일이 있다고 가정하십시오 . ls
또는 stat
파일은 4096 바이트를보고합니다.
rsync
- 파일 디스크립터 fd를 엽니 다.
- fstat (fd)를 사용하여 크기와 같은 정보를 얻습니다.
- 읽은 크기 바이트, 즉 4096을 설정하십시오 . @mattdm으로 연결된 코드의 253 행 입니다.
read_size == 4096
- 물어보기; 읽기 : 4096 바이트
- 짧은 문자열을 읽습니다 (예 : 18 바이트).
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- 물어보기; 읽기 : 4078 바이트
- 읽은 0 바이트 (처음 읽었을 때 파일의 모든 바이트가 소비 됨)
nread == 0
, 255 라인
4096
바이트 를 읽을 수 없습니다 . 제로 아웃 버퍼.
- 오류를 설정하십시오
ENODATA
.
- 반환.
- 오류를보고하십시오.
- 다시 해 보다. (위 루프).
- 불합격.
- 오류를보고하십시오.
- 좋아.
이 과정에서 실제로 전체 파일을 읽습니다. 그러나 사용 가능한 크기가 없으면 결과를 확인할 수 없으므로 실패는 옵션 일뿐입니다.
cp
- 파일 디스크립터 fd를 엽니 다.
- fstat (fd)를 사용하여 st_size와 같은 정보를 얻습니다 (lstat 및 stat도 사용).
파일이 희박한지 확인하십시오. 즉 파일에 구멍이 있습니다.
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
으로 stat
보고서 파일이 제로 블록을 가지고 그것은 드문 드문로 분류된다.
익스텐트 복사 ( 일반
스파 스 파일 을 복사하는보다 효율적인 방법)로 파일을 읽으려고 시도했지만 실패합니다.
- 스파 스 복사로 복사합니다.
- MAXINT의 최대 읽기 크기로 시작합니다.
일반적으로
18446744073709551615
32 비트 시스템의 바이트입니다.
- 물어보기; 4096 바이트를 읽습니다. (통계 정보로부터 메모리에 할당 된 버퍼 크기)
- 짧은 문자열을 읽습니다 (예 : 18 바이트).
- 구멍이 필요한지 확인하십시오.
- 대상에 버퍼를 씁니다.
- 최대 읽기 크기에서 18을 뺍니다.
- 물어보기; 4096 바이트를 읽습니다.
- 처음 읽을 때 모두 0 바이트가 소비되었습니다.
- 성공을 돌려줍니다.
- 다 괜찮아. 파일의 업데이트 플래그.
- 좋아.
/sys/
하시겠습니까?