드라이브의 할당되지 않은 공간을 정리하는 유틸리티

드라이브의 할당되지 않은 공간을 정리하는 유틸리티

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

새로운 버전이 있는 경우 util-linux전체 장치 또는 장치 내의 범위를 정리할 수 있는 옵션과 사용 기능이 있는 도구가 포함되어 있습니다.blkdiscard--offset--length

참고: blkdiscard위험합니다. 잘못된 영역을 자르면 데이터가 사라집니다!

따라서 이 도구를 사용하면 분할된 테이블에서 분할되지 않은(사용 가능한) 영역을 찾아 정리할 수 있습니다. msdosgpt파티션의 경우 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

이 출력이 올바른지 확인하고 원하는 경우 추가 옵션(장황한?)을 추가한 다음 마지막으로 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.confLVM이 TRIM 자체를 방출하므로 호출을 건너뛸 수 있습니다 blkdiscard.lvremove

답변2

hdparm --trim-sector-ranges범위를 잘라낼 수 있습니다. 매뉴얼 페이지에서는 사용에 대해 경고하므로 올바른 범위와 구문을 얻는 것이 좋습니다.

때로는 부트로더 코드나 두 번째 파티션 테이블과 같은 숨겨진 데이터가 있기 때문에 모든 데이터를 파티션 외부로 보내는 것은 위험하다고 생각합니다. 파티션 외부의 어떤 영역이 실제로 사용되지 않는지 정확히 알아야 합니다.

답변3

주의하세요 blkdiscard- 이것은 매우 위험하고 혼란스러울 수 있습니다.

다음 명령을 실행했을 때 테스트 시스템에서 예상치 못한 일이 발생했습니다.

root@test:/home/test# fdisk -l /dev/nvme1n1
Device               Start        End    Sectors   Size Type
/dev/nvme1n1p1        2048    1101823    1099776   537M EFI System
/dev/nvme1n1p2     1134592    1658879     524288   256M Linux RAID
/dev/nvme1n1p3     1658880 1025658879 1024000000 488.3G Linux RAID    
root@test:/home/test# 
root@test:/home/test# blkdiscard /dev/nvme0n1
root@test:/home/test# fdisk -l /dev/nvme0n1
bash: /usr/sbin/fdisk: cannot execute binary file: Exec format error
root@test:/home/test# 
root@test:/home/test# fdisk -l /dev/nvme1n1
bash: /usr/sbin/fdisk: cannot execute binary file: Exec format error
root@test:/home/test# fdisk -l /dev/nvme1n1p1 
bash: /usr/sbin/fdisk: cannot execute binary file: Exec format error
root@test:/home/test# 
root@test:/home/test# fdisk 
bash: /usr/sbin/fdisk: cannot execute binary file: Exec format error

확실히 다른 드라이브가 잘렸습니다! 운영 체제가 설치되어 있습니다.nvme1n1p1..3그리고NVME0N1시승입니다.

다행스럽게도 내 테스트 시스템이 완전히 손실되어 별 문제는 아니지만 경고하기 위해 이 내용을 공개적으로 공유해야 한다고 생각합니다.

더 나은 접근 방식이 언급된 대로 fstrim설정 될 것이라고 생각합니다.issue_discards = 1lvm.conf프로스트슈츠

2024년 편집: 일부는 이것을 싫어할 수도 있지만 저는 ZX Spectrum을 첫 번째 컴퓨터로 시작하여 30년의 컴퓨터 경험을 가지고 있습니다. 특히 잠긴 파티션 매핑 상황이나 컴퓨터가 부팅 우선 순위를 다른 efi 파티션으로 변경하는 경우, efi가 두 디스크 모두에 있고 시스템 fstab이 포함되어 있는 경우 OS 레벨 매퍼에 문제나 버그가 있을 수 있다고 확신합니다. 디스크에 정의된 또 다른 efi. 거기할 수 있다여러 시나리오가 있으므로 blkdiscard명령은 다음과 함께 사용해야 합니다.극도의 주의나의 주요 조언은 시스템을 사용하기 전에 시스템을 재부팅하라는 것입니다. 이 명령데이터 파괴.

관련 정보