📖 목차
🗒️ 개요
필자는 오래전 아마존 외장HDD 대란때 구매했던 WD Elements 외장 드라이브를 다른 사람들처럼 HDD만 적출하여 쓰지 않고, 제품 그대로 USB 3.0으로 연결하여 리눅스 서버에 연결하여 사용하고 있다. 이외에도 WD Red NAS 드라이브를 SATA로 연결하여 사용 중인데, SATA로 연결되어 있는 다른 드라이브들과 달리 WD Eelements는 ‘hdparm -S {시간}’ 명령어 통한 드라이브 절전모드(또는 드라이브 파킹)에 진입하는 시간을 조절할 수 가 없었다.
결국 WD Elements 외장 드라이브의 절전모드 시간을 조절하기 위해 알아본 결과 hdparm 명령어가 아닌 sdparm 명령어가 필요했다. 본 글은 sdparm 명령어로 외장 드라이브 절전모드를 설정하는 것과 왜 sdparm 명령어를 통해 외장 드라이브를 제어하는지에 대해 설명한다.
⌨️ sdparm 명령어와 hdparm 명령어의 차이
❓ 외장드라이브에 hdparm 명령어가 작동하지 않는 이유?
WD Elements와 같은 외장 드라이브에서 hdparm 명령어가 작동하지 않는 이유는 man 페이지에 나와있는 설명처럼 SATA/IDE 디바이스 인자를 받아 사용자의 명령을 수행하는 명령어이기 때문이다. USB로 연결된 외장드라이브(WD Elements와 같은 장치)는 SATA/IDE로 연결되는 것이 아닌 USB Attached SCSI Protocol(UASP 혹은 UAS)을 사용하여 연결한다.1
UASP의 문자 그대로의 의미를 보면 USB를 SCSI에 붙이는 프로토콜임을 알 수 있는데, UASP로 연결된 USB 외장드라이브는 말 그대로 SCSI 장치로 작동한 다는 것으로 알 수 있다. SATA 장치가 아닌 SCSI 장치이므로 당연하게도 SATA/IDE 장치를 설정하는 hdparm 명령어가 제대로 작동하지 않는다. 대신 SCSI 장치를 설정하는 sdparm 명령어를 이용하여 설정해야한다.
여기서 외장드라이브 내부에 들어있는 장치는 SATA 드라이브인데 왜 SCSI 장치로 인식되는 것에 대한 의문 가질 수 있을 것이다. 해당 내용은 바로 아래에 설명하며, 빠르게 설정이 필요한 사용자는 3번 항목으로 건너뛰어 명령어만 확인하는 것을 추천한다.
🤔 SATA 장치인데 왜 SCSI 장치로 인식될까?
외장드라이브에 SATA 드라이브가 들어있는데 SCSI 장치로 인식되는 이유는 UASP로 연결되기 때문이다.
외장드라이브에 연결된 SATA 장치는 외장드라이브 내부에 있는 컨트롤러 칩셋을 통해 UASP 규격으로 연결되어 SCSI / ATA Translation을 거쳐 SCSI 장치로 인식되는 과정을 거친다. UASP 규격은 SCSI architectural model 호환성을 포함하고 있어, SCSI 장치로 다룰 수 있게 된다. 이 뜻은 UASP 연결된 시스템에서 해당 장치를 SCSI 명령어를 통해 컨트롤 한다는 의미이며, SATA/IDE와 같은 규격으로 다루지 않는다는 의미이다.

쉽게 풀이하자면, 외장드라이브가 내부에 있는 SATA 장치가 시스템에 연결될 때, SCSI 장치로 인식하는 변환 과정을 거쳐 SCSI 장치로 인식된다 보면 될 것이다.
💤 절전모드 진입 시간 설정하기
⚙️ sdparm 명령어를 이용하여 절전모드 시간 설정하기
기존 SATA/IDE 장치의 절전모드 진입 시간을 hdparm 명령어를 이용했다면 다음과 같이 적용하였을 것이다.
linux@svr:~$ sudo hdparm -S 120 /dev/sd{x}
/dev/sd{x}:
setting standby to 120 (10 minutes)
위 명령어와 같이 기존 SATA/IDE 드라이브들은 hdparm -S 명령어는 숫자 1~240까지의 범위를 통해 5초 단위로 절전모드 진입을 설정했다. 그렇다면, hdparm 명령어에 외장 드라이브 경로 인자를 입력하면 어떠한 결과가 나올까?
linux@svr:~$ sudo hdparm -S 120 /dev/sd{x}
/dev/sd{x}:
setting standby to 120 (10 minutes)
SG_IO: bad/missing sense data, sb[]: f0 00 01 00 50 00 00 0a 00 00 00 00 00 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
위의 결과와 같이 SG_IO: bad/missing sense data 에러가 발생하며, 해당 명령이 수행되지 않는 결과를 얻을 것이다. 당연하게도 SCSI 장치에 SATA/IDE 명령어를 입력하면 해석하지 못하기 때문이다.
그래서 제대로된 설정을 하기위해 sdparm 명령어를 다음과 같이 입력하여 설정하여야 한다.
linux@svr:~$ sudo sdparm -a /dev/sd{x}
/dev/sd{x}: WD Elements 25A3 1021
Power condition mode page:
PM_BG 0 [cha: n, def: 0, sav: 0]
STANDBY_Y 0 [cha: n, def: 0, sav: 0]
IDLE_C 0 [cha: n, def: 0, sav: 0]
IDLE_B 0 [cha: n, def: 0, sav: 0]
IDLE 0 [cha: n, def: 0, sav: 0]
STANDBY 1 [cha: y, def: 1, sav: 1]
ICT 0 [cha: n, def: 0, sav: 0]
SCT 18000 [cha: y, def:18000, sav:18000]
IBCT 0 [cha: n, def: 0, sav: 0]
ICCT 0 [cha: n, def: 0, sav: 0]
SYCT 0 [cha: n, def: 0, sav: 0]
CCF_IDLE 0 [cha: n, def: 0, sav: 0]
CCF_STAND 0 [cha: n, def: 0, sav: 0]
CCF_STOPP 0 [cha: n, def: 0, sav: 0]
linux@svr:~$ sudo sdparm --set SCT=6000 /dev/sd{x}
/dev/sd{x}: WD Elements 25A3 1021
linux@svr:~$ sudo sdparm -a /dev/sd{x}
/dev/sd{x}: WD Elements 25A3 1021
Power condition mode page:
PM_BG 0 [cha: n, def: 0, sav: 0]
STANDBY_Y 0 [cha: n, def: 0, sav: 0]
IDLE_C 0 [cha: n, def: 0, sav: 0]
IDLE_B 0 [cha: n, def: 0, sav: 0]
IDLE 0 [cha: n, def: 0, sav: 0]
STANDBY 1 [cha: y, def: 1, sav: 1]
ICT 0 [cha: n, def: 0, sav: 0]
SCT 6000 [cha: y, def:18000, sav:18000]
IBCT 0 [cha: n, def: 0, sav: 0]
ICCT 0 [cha: n, def: 0, sav: 0]
SYCT 0 [cha: n, def: 0, sav: 0]
CCF_IDLE 0 [cha: n, def: 0, sav: 0]
CCF_STAND 0 [cha: n, def: 0, sav: 0]
CCF_STOPP 0 [cha: n, def: 0, sav: 0]
위의 내용을 통해 sdparm 명령어와 hdparm 명령어의 다른 부분이 명확하게 보일 것이다.
hdparm의 경우 -S 인자를 붙여 명령어를 수행할 경우 해당 장치의 유휴상태 진입 시간을 표기해 출력하여 명령어가 잘 수행됐는지 인지할 수 있었지만, sdparm의 경우 –set SCT={숫자} 인자를 통해 명령어를 입력하면 장치 이름만 출력되어 sdparm -a 명령어를를 입력해서 SCT 값이 수정되었는지 다시 확인해야 한다.
여기서 SCT 값은 Standby condition timer을 의미하며, SCT의 값은 1 = 0.1초의 값을 가진다. 즉, 절전모드 진입 시간이 1분은 SCT=600, 10분은 SCT=6000, 20분은 SCT=12000이 되는 것이다.
또한, hdparm의 -S 명령어와 달리 sdparm은 장치의 유휴 진입 시간을 새세하게 조정할 수 있다는 장점을 가지고 있다.
sudo sdparm --set SCT={시간} /dev/{장치경로}
sudo sdparm -a /dev/{장치경로}
위는 sdparm의 명령어를 간략한 내용이다.
sdparm 명령어는 root 권한을 요구하므로 sudo 권한이 있는 계정의 경우 sudo를 입력하면된다. root 계정으로 접속하여 명령어를 입력했다면 sudo는 제외해도 된다. { } 처럼 가로로 표시한 부분은 사용자가 직접 설정 해줘야하는 부분이며, 시간의 경우 위의 내용을 다시 참고하여 입력하면 된다.
🥅 sdparm 명령어의 적용 범위
도입부의 내용과 같이 sdparm 명령어는 SCSI 장치를 다루기 위해 있는 리눅스의 명령어다. USB 외장 드라이브와 같은 장치를 다룰수도 있지만 기본적으로 시스템 내의 SCSI 장치를 다루는 명령어이며, 해당 명령어를 통해 SCSI 장치 또한 절전모드에 진입하는 시간을 조정하거나 장치를 시스템에서 해제시키는 등 다양한 작업을 수행 할 수 있다.
당연하게도 SATA/IDE 장치의 경우 기존처럼 hdparm 명령어를 이용해야한다.
📒 여담
sdparm 명령어는 SCSI 장치를 다루다보니 SAS나 구형 SCSI 드라이브를 제어할 때 자주 쓰이겠다 생각하겠지만, 아시다시피 24시간 돌아가는 서버환경에서 특별한 목적이 아닌 이상 드라이브의 절전모드 진입 시간을 설정할 이유가 없기도하며, SAS 드라이브의 경우 주로 RAID 컨트롤러에 연결하는 특성상 RAID 컨트롤러 명령어로 드라이브를 조작하는 상황이 많기 때문에 더더욱 sdparm 명령어 접근성이 떨어지기도 할 것이다. 이러한 이유 때문인지 sdparm 명령어에 대한 정보는 개인용 NAS나 서버를 구축하는 사용자가 더 많은 외국 사이트들의 문서를 통해서 접근하기 쉽다. 심지어 국내 구글 검색의 경우에도 sdparm으로 입력하면 hdparm으로 자동으로 변환하여 검색 결과를 표시해줄 정도이니 말이다.(물론, sdparm 단어와 한글 단어 조합일 경우의 결과이다.)
필자의 경우에도 당시 외장 드라이브의 절전 진입 시간 조정을 위해 hdparm 명령어를 실행해 적용이 안되는 이슈를 처음 겪었는데, 국내 문서에서 찾지못해 외국 문서를 참조하여 위의 방법을 찾아 해결하였다.
혹시, 필자와 같은 상황을 겪을 사용자들을 위해 이와 같은 글을 작성하게 되었으며, 도움이 되길 바라며 글을 마친다.
- 물론, 모든 USB 외장드라이브 장치가 UASP를 통해 연결되는 것은 아니다. 현존하는 USB 3.0 규격의 외장 드라이브의 경우 대부분 UASP를 지원하지만, 오래된 장치의 경우 지원하지 않을 수 있다. ↩︎