하나의 문자가 포함 된 파일에서 ls -l을 실행하면 크기가 2B로 표시됩니다. 파일 시스템이 4k 블록이면 파일을 블록 크기로 반올림했다고 생각합니까? ls -l이 실제로 inode에서 바이트 수를 읽기 때문입니까? 어떤 상황에서 리눅스 2.6 커널 GNU 유틸리티의 응답과 실제 바이트 수 응답을 차단하기 위해 반올림됩니까?
하나의 문자가 포함 된 파일에서 ls -l을 실행하면 크기가 2B로 표시됩니다. 파일 시스템이 4k 블록이면 파일을 블록 크기로 반올림했다고 생각합니까? ls -l이 실제로 inode에서 바이트 수를 읽기 때문입니까? 어떤 상황에서 리눅스 2.6 커널 GNU 유틸리티의 응답과 실제 바이트 수 응답을 차단하기 위해 반올림됩니까?
답변:
echo a > file
또는 파일을 사용하여 파일에 하나의 문자를 넣은 vim file
것 같습니다. 즉, 해당 문자와 추가 줄 바꿈이 있어야합니다 (2 문자, 따라서 2 바이트). ls -l
블록이 아닌 파일 크기를 바이트 단위로 표시합니다 (보다 구체적으로 : 파일 길이 ).
$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$
( cat -A
개행은 $
문자로 표시됨)
하는 반면 ls -l
, du
실제 크기를 표시합니다 디스크에 점령 :
$ du testfile
4
(실제로 du
1KB 단위로 크기를 표시하므로 크기는 4 × 1024 바이트 = 4096 바이트 = 4KB이며,이 파일 시스템의 블록 크기입니다)
이를 ls
표시 하려면 다음 -s
대신 / 옵션 을 사용해야합니다 -l
.
$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
첫 번째 열은 할당 된 크기이며 다시 1kiB 단위입니다. 마지막은 지정하여 변경할 수 있습니다 --block-size
, 예를 들어,
$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
깊은 대답은 다음과 같습니다.
논리 파일 길이와 디스크 공간은 실제로 다릅니다.
다른 답변에서 볼 수 있듯이 원칙적으로 2 바이트로 작성된 파일은 길이가 2 바이트 (show by ls -l
)이고 4 KiB를 차지합니다 (show by du
또는 ls -ls
).
보다:
1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test
Ok, test
길이 1과 크기 (디스크) 4 KiB가 있습니다. 그러나:
1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4 test
(첫 번째 명령에 8191 0 바이트 추가 test
), 이제 테스트의 길이는 8192이지만 디스크에서 4 KiB를 차지합니다 ( "구멍"이 있음) (1).
일부 파일 시스템은 짧은 파일을 압축하여 블록을 공유하여 공간을 덜 차지하고 (예 : 테일 패킹 참조 ) btrfs 와 같은 다른 파일은 쓰기시 복사를 수행 하므로 파일, 논리 길이 및 차지하는 공간의 관계 디스크는 복잡한 디스크입니다.
각주 :
(1) 그것은 실제로 구멍이 아니며 끝입니다 ...하지만 여전히 예제의 끝까지 작동합니다.
ls -l
그냥 긴 형식입니다. ls -ls
블록 크기를 표시하는 데 사용됩니다.
테스팅
echo "1" > 1.txt
bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
보시다시피 파일 크기는 2B로 표시됩니다. 그러나 블록 크기를 확인해야하는 경우 아래 명령을 실행해야합니다.
bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
위의 4는 사용 된 블록 크기를 표시합니다. stat
명령을 사용하여 동일한 내용을 확인할 수도 있습니다 .
bash-3.2$ stat 1.txt
File: `1.txt'
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 48267720 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 505/ ramesh) Gid: ( 508/ ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500
이제 ls -ls
블록 크기를 4로 나열하고 블록 크기를 8로 stat
표시하는 이유에 대한 의문이 생깁니다. 이 동작의 이유는 여기 의 답변에 명확하게 설명되어 있습니다 .
많은 디스크의 섹터 크기는 512 바이트입니다. 즉, 디스크에서 읽거나 쓰면 전체 512 바이트 섹터가 한 번에 전송됩니다. 섹터가 파일로 분할되지 않은 파일 시스템을 디자인하는 것은 당연합니다 (디자인을 복잡하게하고 성능을 저하시킬 수 있습니다). 따라서 파일 시스템은 파일에 512 바이트 청크를 사용하는 경향이 있습니다. 같은 따라서 기존의 유틸리티
ls
와는du
512 바이트 청크 단위로 크기를 표시합니다.