2012-04-28 4 views
2

다음과 같은 문제가 발생했습니다. Linux에서 cp 명령을 사용하여 파일 A를 파일 B에 복사 할 때이 파일들의 크기는 다릅니다. A는 6.4M이고 B는 7.0M입니다. 동일한 디렉토리에서이 작업을 수행하더라도 (다른 드라이브의 다른 블록 크기를 피하기 위해) 발생합니다.cp를 사용할 때 파일 크기가 변경됨

이 내용은 무엇인가요? 피하는 법? 그것은 파일을 변경합니까?

또한 다른 이상한 행동이 있습니다. 파일 A를 파일 B에 대입하고 B의 크기를 즉시 확인하려고하면 B의 크기가 7.0M이고 일정하다가 잠시 후에 0 또는 6.2M이됩니다. 복사의 중간 결과를 포착 할 수 있습니까? 왜 그렇게 느린가?

+4

사진이 찍히지 않았거나 발생하지 않았습니다. –

+3

"파일 크기"를 결정하는 방법에 따라 스파 스 파일에서이 문제가 발생할 수 있습니다. – Mat

+0

그러면 파일 (내부 구조)이 변경됩니까? 바이너리 파일에 어떤 영향을 줍니까? – user938720

답변

4

가정 할 때 coreutilsducp.

cp 복사 파일, 휴리스틱을 사용하여 "스파 스"를 보존하기 위해을 시도 그것. 기본적

스파 스 소스 파일 조 추론에 의해 검출되고 대응 DEST 파일뿐만 아니라 희소 이루어진다.

따라서 휴리스틱에 실패하면 cp은 구멍이없는 일반 파일을 만듭니다. 이 경우 복사본의 디스크 사용량은 원본 –의 디스크 사용량보다 커지지 만 명백한 파일 크기는 동일해야하며 내용은 동일해야합니다 (시도 cmp).

파일의 겉보기 크기와 디스크 사용량 (더 많은 정보 더보기)을 보려면 stat을 사용하십시오.

$ dd if=/dev/zero of=./sparse bs=1 count=1 seek=10240000 
1+0 records in 
1+0 records out 
1 byte (1 B) copied, 1.4101e-05 s, 70.9 kB/s 
$ cp sparse copy1 
$ cp --sparse=never sparse copy2 
$ ll 
-rw-r--r-- 1 me users 10240001 Apr 28 17:59 copy1 
-rw-r--r-- 1 me users 10240001 Apr 28 18:00 copy2 
-rw-r--r-- 1 me users 10240001 Apr 28 17:59 sparse 
$ du sparse copy* 
4 sparse 
4 copy1 
10004 copy2 
$ stat sparse copy* 
    File: `sparse' 
    Size: 10240001 Blocks: 8   IO Block: 4096 regular file 
... 
    File: `copy1' 
    Size: 10240001 Blocks: 8   IO Block: 4096 regular file 
... 
    File: `copy2' 
    Size: 10240001 Blocks: 20008  IO Block: 4096 regular file 
$ cmp sparse copy1 && echo identical 
identical 
$ cmp sparse copy2 && echo identical 
identical 
1

FIEMAP와 버그의 번호가 있었다 :

http://lwn.net/Articles/429349/

http://lkml.indiana.edu/hypermail/linux/kernel/0906.1/00436.html

http://www.spinics.net/lists/linux-ext4/msg24337.html

그래서 내가로 coreutils에서 버그가 CP를 의심 FIEMAP과를 사용하려고 FIEMAP을 올바르게 처리하지 못하는 커널의 버그가있는 파일 시스템. 커널과 coreutils 패키지를 업그레이드하십시오.

+0

의견을 보내 주셔서 감사합니다. 나는 XFS 포맷의 파일 시스템에서 cp를 사용할 때이 점을 발견했다. 반면 ext4에서는 정상적으로 작동한다. 많은 파일 시스템을 재 포맷 할 시간 ... –

관련 문제