리눅스

리눅스에서 USB 외장SSD의 TRIM

맑은돌 2019. 12. 18. 18:19

빠른 속도 때문에 사용하는 SSD도 적절히 TRIM을 하지 않으면 쓰기 폭증 효과로 SSD의 성능이 저하될 수 있습니다.
TRIM 기능을 이용하면 SSD의 삭제된 파일이 차지하는 공간을 비울 수 있고 위 문제를 해결할 수 있습니다.

문제는 USB 외장SSD는 TRIM이 불가능하다고 알려져 있는 것입니다.
TRIM이 가능한 썬더볼트 외장SSD는 썬더볼트 외장케이스 가격이 비싼 것을 떠나서 구하기도 어렵고, eSATA는 사용 여건이 안 되므로 제외입니다.

그런데 USB 외장SSD도 트림을 할 수 있는 경우가 있습니다.


그림 1. WD SSD 대시보드 실행 화면


- SSD : 2.5형 WD BLUE SSD 3D
- 외장케이스 : micro USB to USB 타입 A - USB 3.1(1세대) 인터페이스 - 2.5형 SSD/HDD 외장 케이스 StoreJet 25S3 - UASP(USB Attached SCSI Protocol) 지원
- 운영체계 : 윈도 7
- 소프트웨어 : 웨스턴 디지털 SSD 대시보드 2.6.0.0 출시일: 2019/12/02
- 파티션 종류 : 윈도 NTFS 형식이면 트림이 가능합니다. 리눅스 EXT4 형식은 마운트 할 수 없어서 TRIM을 사용할 수 없습니다.


1. USB 연결 후 WD 대시보드를 실행합니다.
 

그림 2. 내장 SSD를 선택한 화면


2. USB 외장SSD로 변경합니다.

 

그림 3. USB 외장SSD를 선택한 화면


3. 성능 탭 - (최적화) TRIM - 지금 TRIM 실행 (Run TRIM Now) 또는 Windows TRIM 활성화를 선택하면 됩니다.

 

그림 4. USB 외장SSD이지만 TRIM이 가능한 화면

 

그림 5. USB 외장SSD TRIM 실행 중인 화면

 

그림 6. USB 외장SSD TRIM을 완료한 화면


윈도에서 외장SSD의 TRIM이 가능하니까 똑같은 조건이라면 리눅스에서도 가능하지 않을까 하고 리눅스에서도 해봅니다.


운영체계 : 우분투 18.04.3 LTS
파티션 종류 : 윈도 NTFS 형식과 리눅스 EXT4 형식으로 테스트 합니다.


NTFS와 EXT4 파티션 둘다 SSD의 삭제된 파일이 차지한 공간을 비우는 작업(TRIM)을 할 수 없습니다.


하는 수 없이 구글에서 찾아보았지만 USB 외장SSD는 TRIM이 불가능하다고만 합니다.
"컨트롤러가 트림을 지원하지 않기 때문에 SSD를 메인보드 SATA 포트 중 하나에 연결하라"는 답변이 입니다.

하지만 위에서 보는 것처럼 윈도에서 WD SSD 대시보드를 이용해서 USB 외장SSD의 트림을 할 수 있으니 리눅스에서도 가능하겠죠. 그러다가 찾은 문서를 보고 그대로 따라 했지만... TRIM은 할 수 없었습니다. 다음은 그 과정입니다.



리눅스에서 외장SSD의 트림 사용
원문 링크. https://www.glump.net/howto/desktop/enable-trim-on-an-external-ssd-on-linux

문제.


lsblk --discard를 실행하여 Trim을 지원하는 커널에서 새 SSD가 초기화되었는지 확인하면 명령 프롬프트에 다음이 표시됩니다.


$ lsblk --discard /dev/sdc

 

그림 1. 기본적으로 USB를 통한 트림을 지원하지 않는 리눅스

리눅스는 기본적으로 USB를 통한 트림을 지원하지 않는 것 같습니다.

 

해결책.

1. 공급 업체 ID 및 제품 ID를 식별하십시오.


$ lsusb


그림 2. 공급 업체 ID 및 제품 ID를 식별


Bus 004 Device 003: ID 8564:7000 Transcend Information, Inc.


공급 업체 ID : 8564 , 제품 ID : 7000 임을 알 수 있습니다.


2. udev 규칙 생성. 텍스트 편집기에서이 규칙을 입력하십시오.


$ sudo vim.tiny /etc/udev/rules.d/50-usb-ssd-trim.rules
ACTION=="add|change", ATTRS{idVendor}=="8564", ATTRS{idProduct}=="7000", SUBSYSTEM=="scsi_disk", ATTR{provisioning_mode}="unmap"


그림 3. udev 규칙 생성


USB 외장SSD를 분리했다가 다시 장치를 연결할 때 트림이 작동합니다.


$ lsblk --discard /dev/sdc

$ cat /sys/block/sdc/device/scsi_disk/*/provisioning_mode


그림 4. 다시 장치를 연결할 때 트림 작동

 

3. 파일 시스템이 트림을 지원하는지 확인하십시오

$ sudo fstrim -v "/media/사용자계정/SSD볼륨이름"

FITRIM ioctl failed: 원격 입출력 오류

the discard operation is not supported.


마운트한 NTFS, Ext4 파일시스템 모두 트림이 작동하지 않습니다.
lsblk에 DISC-GRAN 또는 DISC-MAX 열에 값이 있는데도 실패합니다.


그림 5. 파일 시스템이 트림을 지원하는지 확인


fstrim 실패후 DISC-MAX 값이 4G에서 0B로 바뀝니다.

앞서도 말했지만 윈도에서 WD SSD 대시보드를 이용해서 USB 외장SSD의 트림을 할 수 있으니 리눅스에서도 할 수 있을 것입니다. 리눅스에서도 USB 외장SSD의 TRIM이 하는 날이 다가오기를 기대하며 문제 해결을 위해 노력하는 리눅서 분들을 응원합니다.