드라이브에서 할당되지 않은 공간을 트리밍하는 유틸리티


11

ext4 파티션이 몇 개 있지만 할당되지 않은 공간이있는 드라이브 (SD 카드)가 있습니다. 이 fstrim유틸리티는 파일 시스템 내에서만 작동 할 수 있습니다. 휠을 다시 작성하고 쓰기 전에 할당되지 않은 공간을 트리밍하거나 명시 적으로 지정된 범위를 트리밍 할 수있는 다른 유틸리티가 있습니까?

장치에서 할당되지 않은 공간의 대부분이 현재 컨트롤러에 의해 사용 가능한 것으로 알려져 있지 않은지 확인할 수 있습니다 .이 특정 카드에서 잘린 공간 반환 0을 읽지 만 장치 스캔 결과는 많은 가비지 데이터가 남아 있습니다.

편집 : 사용 중 문제가 hdparm있습니다. 아래 예제는 첫 번째 섹터를 삭제하지만 지정한 범위에 관계없이 동일한 결과가 나타납니다. fstrim장치에 문제가 없습니다 :

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

더 조사 중이지만 통찰력이있는 사람이 있습니까?


1
분할되지 않은 공간을 하나 이상의 파티션으로 (일시적으로) 매핑 blkdiscard하면 전체 장치를 다듬는 공간에서 사용할 수 있습니다 .
frostschutz

감사! 그것은 올바른 도구처럼 blkdiscard보이지만 표준 패키지 저장소에서 사용할 수없는 것 같습니다 (Ubuntu 12.04,에없는 것 같습니다 util-linux).
Jason C

hdparm어떤 이유로 든 나를 위해 일할 수 없었지만 github.com/karelzak/util-linux/tree/stable/v2.23 에서 util-linux 소스를 가져 와서 빌드했습니다 ( ./autogen.sh ; ./configure ; make blkdiscard). 아직도 미스터리 hdparm하지만 blkdiscard내가 원하는 것을 정확하게합니다. 보너스 : 임시 파일 시스템을 먼저 만들 필요가 없습니다 . sfdisk -l파티션 사이의 공간을 알아 내고 blkdiscard다듬을 수 있습니다.
Jason C

오, 나는 blkdiscard오프셋 / 길이 옵션으로 작업 할 수 있다는 것을 알지 못했습니다 . 그래서 내가 제안한 임시 파티션은 필요하지 않습니다. 좋은!
frostschutz

답변:


16

최신 버전의을 (를) 보유하고있는 경우 util-linux여기에는 blkdiscard전체 장치를 트리밍 할 수 있는 도구 가 포함되어 있으며 장치 --offset--length옵션을 사용하여 장치 내 범위를 지정할 수 있습니다.

참고 : blkdiscard 위험합니다. 잘못된 지역을 트리밍하면 데이터가 사라집니다!

따라서 파티션 테이블의 파티션되지 않은 (자유로운) 영역을 파악한 다음이 도구를 사용하여 트리밍 할 수 있습니다. for msdosgptpartition parted은 다음 과 같이 빈 영역을 제공합니다.

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

그것에 루프를 추가하십시오 ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

인쇄

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

이 출력이 올바른지 확인하고 원하는 경우 (verbose?) 옵션을 추가 한 다음 마지막으로 제거하여 echo실제로 실행되도록 설정하십시오.

이 예제의 두 번째 명령은 길이가 너무 작기 때문에 실제로 실패합니다. 루프 내부를 확인하는 것이 좋습니다. 1MB보다 작은 영역은 잘리지 않을 수 있으므로 무시하십시오.


파티션 대신 LVM을 사용하는 경우 비어있는 공간에 대한 LV를 작성하고 다음을 트리밍 할 수 있습니다.

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

issue_discards = 1에서 설정 한 경우 LVM에서 TRIM을 자체적으로 발급하므로 통화를 lvm.conf건너 뛸 수 있습니다.blkdiscardlvremove


1
감사! Michael의 답변도 유효하지만 나에게 도움이되기 때문에이 답변으로 언급했습니다. 또한 나는 질문의 의견에 내가 말한 추가 할 것입니다 : 당신이 경우 하지 않습니다blkdiscard가능합니다; github.com/karelzak/util-linux/tree/stable/v2.23 에서 util-linux 소스를 가져온 다음 빌드 blkdiscard(run ./autogen.sh ; ./configure ; make blkdiscard)-깨끗하게 빌드됩니다 ( 일부 종속성을 설치하고 configure옵션을 조정해야 할지라도 ) 설치하지 않으면 기존 util-linux와 충돌하지 않습니다.
Jason C

1
특정 값을 전달하여 실패를 관찰 blkdiscard했지만 값이 길이가 아닌 오프셋을 기반으로한다는 것을 알았습니다. 에 문제가있을 수 있습니다 blkdiscard. 조사하는 중입니다. 참조 unix.stackexchange.com/questions/98473/...
제이슨 C

마운트 된 모든 파일 시스템과 사용 가능한 LVM VG에서 사용 가능한 공간을 삭제하는 스크립트를 작성했습니다. github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-ranges범위를 다듬을 수 있습니다. 매뉴얼 페이지에서이를 사용하도록 경고하므로 올바른 범위와 구문을 확보하는 것이 좋습니다.

부트 로더 코드 또는 두 번째 파티션 테이블과 같은 숨겨진 데이터가 있기 때문에 파티션 외부의 모든 데이터에 대한 트림을 보내는 것은 위험 할 수 있다고 생각합니다. 파티션 외부의 영역 중 실제로 사용되지 않는 영역을 알아야합니다.


고마워요! hdparm에서 사용하지 않은 범위를 사용 하여 장치 크기를 잡고 sfdisk그에 따라 다듬을 수 있습니다. 드라이브에 무엇이 있는지 알고 있습니다. 액세스 가능하지만 할당되지 않은 영역에서 데이터를 숨기는 파티셔닝 구성표가 있으면 파티션 편집기의 기본 기능이 손상됩니다. 나는 이와 같은 계획이 오랫동안 버려 졌다고 가정한다. (그러나 나는 머리 꼭대기에 아무도 없다.) 내가 아는 모든 구성표는 장치 시작시 잘 알려진 할당되지 않은 공간에 MBR을 저장하고 할당 된 파티션 내의 VBR / EBR을 저장합니다. 다른 오래된 모호한 구성표가있을 수 있습니다. :)
Jason C

에 어려움을 겪고 있습니다 hdparm. 자세한 내용으로 질문을 편집했습니다. 통찰력이 있는지 궁금합니다.
Jason C

1
적어도 일부 hdparm은 / dev / mmcblk0에서 작동하지 않는 것 같습니다. 죄송합니다. 더 이상 생각이 없습니다.
Michael Suelmann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.