하드 디스크를 컨트롤하는 아주 쉬운 방법 중에 하나이다.
온라인 상에서 hdparm을 다운 받아서 그냥 깔아만 주면 된다.
http://www.ibiblio.org/pub/Linux/system/hardware/
요기에서, hdparm 최신 버젼을 받는다.
나는 hdparm-5.9.tar.gz을 다운 받았다.
]# tar xzf hdparm-5.9.tar.gz
으로 압축을 풀어서, hdparm-5.9 폴더에 들어가보자.
뭔가가 많다. (사실 이정도는 많은 편은 아니지만)
그리고 그냥 실행하면 된다..;;
]# hdparm -M /dev/hda : 라고 하면, 이 하드가 acoustic setting을 지원하는 지 알 수 있다. 이건 잘 모르겠지만, 하드 스핀 속도를 조절하는 것 같은데, 128~256 값이 있고, 128이 가장 느리고 조용한 상태이고, 256은 가장 빠르지만 시끄러운 상태이다.
내 도시바 R100에서는 작동하지 않는다.
그리고 많이 사용하는 것은,
]# hdparm -y /dev/hda : 이건, standby 상태로, 하드 스핀 속도를 낮추어 놓고 있다가, 어떤 작업이 들어오면 다시 하드가 열심히 돌아간다.
실제로 이걸 써 보면, 하드가 퓽~ 꺼졌다가, 일을 시키면 다시 "이융~~" 하고 돌아가는 것을 들을 수 있다. (조용한 곳에서.)
]# hdparm -Y /dev/hda : 이것은, sleep 상태로, 하드를 잠재운다.. ( '') 그래서 이건 일을 시켜도 안되고, 가서 깨워야 하는데, (hard reset) 내가 못찾은건지는 모르겠는데.... hdparm 에는 하드 리셋 옵션을 찾을 수 없었다. 다행히, 리눅스에서 ACPI를 지원하므로,
내가 일을 시키면 ACPI가 열심히 애를 깨운다. 엄청 늦게 일어난다. (요 ioctl 을 찾아봐야겠다.)
]# hdparm -S 1 /dev/hda : 이것은, 아무 일 없이 1(5초)간 있으면, (idle 상태) 하드를 standby 상태로 만들라는 것. 5초로 설정해 놓으면, 정말, 얘가 계속 혼자 핑~ 이융~ 핑~ 이융~ 하는 것을 들을 수 있다. -_-;;; (오ㅡ 내 베터리~~~ )
]# hdparm -C /dev/hda : 요거는 지금 하드의 상태를 알아보는 것인데.... 이거 실행 시키면 스탠바이 하던 하드도 일어나고, 자고 있던 하드도 일어난다;;;
]# hdparm -w /dev/hda : 요거는 하드 리셋 시키는 건데...
옵션 설명에 (dangerous)라고 적혀있다. 근데 해봤다. 내 노트북에서는 ACPI가 자는 하드를 깨우지만, 그렇지 않다면 시스템을 리붓시킬 수 밖에 없기 때문에, reset 시키는 ioctl 을 call 하는 거 같길래..
함 해봤더니... ( '') 시스템이 뻗었다. 하하하하
(세그멘테이션 오류가 났다. 잘못된 메모리를 참조한 거란다.)
소스 코드가 보고 싶다면, hdparm.c 파일을 보고 열심히 잘 trace 해보면 된다.
hdparm.c
main(int argc, char **argv)
{
...
case 'y';
get_standbynow = noisy;
noisy = 1;
set_standbynow = 1;
break;
case 'Y';
get_sleepnow = noisy;
noisy = 1;
set_sleepnow = 1;
break;
...
process_dev(*p); // *p is device name such as /dev/hda
}
void process_dev (char *devname)
{
int fd=open(devname, open_flag);
...
if (set_sleepnow) {
unsigned char args1[4] = {WIN_SLEEPNOW1,0,0,0}; //#define WIN_SLEEPNOW1 0xE6
unsigned char args2[4] = {WIN_SLEEPNOW2,0,0,0}; //#define WIN_SLEEPNOW2 0x99
if (get_sleepnow)
printf(" issuing sleep command\n");
if (ioctl(fd, HDIO_DRIVE_CMD, &args1)
&& ioctl(fd, HDIO_DRIVE_CMD, &args2))
perror(" HDIO_DRIVE_CMD(sleep) failed");
}
if (set_standby) {
unsigned char args[4] = {WIN_SETIDLE1,standby_requested,0,0};
if (get_standby) {
printf(" setting standby to %lu", standby_requested);
interpret_standby(standby_requested);
}
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" HDIO_DRIVE_CMD(setidle1) failed");
}
...
}
자ㅡ 그러면 저 ioctl()은 어디에 있는가?
헤더는, "/usr/include/sys/ioctl.h" 에 있다.
그리고, 이... 하드의 드라이버를 찾아가보자ㅡ
/usr/src/linux-2.6.9/drivers/ide/
1. Find "HDIO_DRIVE_CMD" : ide.c
int generic_ide_ioctl(struct file *file, struct block_device *bdev, unsigned int cmd, unsigned long arg)
{…
switch (cmd) {
...
case HDIO_DRIVE_CMD:
if (!capable(CAP_SYS_RAWIO))
return -EACCES;
return ide_cmd_ioctl(drive, cmd, arg);
...
}
}
EXPORT_SYMBOL(generic_ide_ioctl); // 요건 밖에서도 이 함수 사용할 수 있도록 끄집어 내 놓은것.
#### 아~ 여기서 부터는 trace를 하긴 했는데, 잘 모르겠네. 호호호호~~ =33
ide-taskfile.c
1. ide_cmd_ioctl( )
2. ide_wait_cmd( )
ide-io.c
ide_do_drive_cmd( )
{
blk_put_request(rq); // driver/block/ll_rw-blk.c
}
온라인 상에서 hdparm을 다운 받아서 그냥 깔아만 주면 된다.
http://www.ibiblio.org/pub/Linux/system/hardware/
요기에서, hdparm 최신 버젼을 받는다.
나는 hdparm-5.9.tar.gz을 다운 받았다.
]# tar xzf hdparm-5.9.tar.gz
으로 압축을 풀어서, hdparm-5.9 폴더에 들어가보자.
뭔가가 많다. (사실 이정도는 많은 편은 아니지만)
그리고 그냥 실행하면 된다..;;
]# hdparm -M /dev/hda : 라고 하면, 이 하드가 acoustic setting을 지원하는 지 알 수 있다. 이건 잘 모르겠지만, 하드 스핀 속도를 조절하는 것 같은데, 128~256 값이 있고, 128이 가장 느리고 조용한 상태이고, 256은 가장 빠르지만 시끄러운 상태이다.
내 도시바 R100에서는 작동하지 않는다.
그리고 많이 사용하는 것은,
]# hdparm -y /dev/hda : 이건, standby 상태로, 하드 스핀 속도를 낮추어 놓고 있다가, 어떤 작업이 들어오면 다시 하드가 열심히 돌아간다.
실제로 이걸 써 보면, 하드가 퓽~ 꺼졌다가, 일을 시키면 다시 "이융~~" 하고 돌아가는 것을 들을 수 있다. (조용한 곳에서.)
]# hdparm -Y /dev/hda : 이것은, sleep 상태로, 하드를 잠재운다.. ( '') 그래서 이건 일을 시켜도 안되고, 가서 깨워야 하는데, (hard reset) 내가 못찾은건지는 모르겠는데.... hdparm 에는 하드 리셋 옵션을 찾을 수 없었다. 다행히, 리눅스에서 ACPI를 지원하므로,
내가 일을 시키면 ACPI가 열심히 애를 깨운다. 엄청 늦게 일어난다. (요 ioctl 을 찾아봐야겠다.)
]# hdparm -S 1 /dev/hda : 이것은, 아무 일 없이 1(5초)간 있으면, (idle 상태) 하드를 standby 상태로 만들라는 것. 5초로 설정해 놓으면, 정말, 얘가 계속 혼자 핑~ 이융~ 핑~ 이융~ 하는 것을 들을 수 있다. -_-;;; (오ㅡ 내 베터리~~~ )
]# hdparm -C /dev/hda : 요거는 지금 하드의 상태를 알아보는 것인데.... 이거 실행 시키면 스탠바이 하던 하드도 일어나고, 자고 있던 하드도 일어난다;;;
]# hdparm -w /dev/hda : 요거는 하드 리셋 시키는 건데...
옵션 설명에 (dangerous)라고 적혀있다. 근데 해봤다. 내 노트북에서는 ACPI가 자는 하드를 깨우지만, 그렇지 않다면 시스템을 리붓시킬 수 밖에 없기 때문에, reset 시키는 ioctl 을 call 하는 거 같길래..
함 해봤더니... ( '') 시스템이 뻗었다. 하하하하
(세그멘테이션 오류가 났다. 잘못된 메모리를 참조한 거란다.)
소스 코드가 보고 싶다면, hdparm.c 파일을 보고 열심히 잘 trace 해보면 된다.
hdparm.c
main(int argc, char **argv)
{
...
case 'y';
get_standbynow = noisy;
noisy = 1;
set_standbynow = 1;
break;
case 'Y';
get_sleepnow = noisy;
noisy = 1;
set_sleepnow = 1;
break;
...
process_dev(*p); // *p is device name such as /dev/hda
}
void process_dev (char *devname)
{
int fd=open(devname, open_flag);
...
if (set_sleepnow) {
unsigned char args1[4] = {WIN_SLEEPNOW1,0,0,0}; //#define WIN_SLEEPNOW1 0xE6
unsigned char args2[4] = {WIN_SLEEPNOW2,0,0,0}; //#define WIN_SLEEPNOW2 0x99
if (get_sleepnow)
printf(" issuing sleep command\n");
if (ioctl(fd, HDIO_DRIVE_CMD, &args1)
&& ioctl(fd, HDIO_DRIVE_CMD, &args2))
perror(" HDIO_DRIVE_CMD(sleep) failed");
}
if (set_standby) {
unsigned char args[4] = {WIN_SETIDLE1,standby_requested,0,0};
if (get_standby) {
printf(" setting standby to %lu", standby_requested);
interpret_standby(standby_requested);
}
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" HDIO_DRIVE_CMD(setidle1) failed");
}
...
}
자ㅡ 그러면 저 ioctl()은 어디에 있는가?
헤더는, "/usr/include/sys/ioctl.h" 에 있다.
그리고, 이... 하드의 드라이버를 찾아가보자ㅡ
/usr/src/linux-2.6.9/drivers/ide/
1. Find "HDIO_DRIVE_CMD" : ide.c
int generic_ide_ioctl(struct file *file, struct block_device *bdev, unsigned int cmd, unsigned long arg)
{…
switch (cmd) {
...
case HDIO_DRIVE_CMD:
if (!capable(CAP_SYS_RAWIO))
return -EACCES;
return ide_cmd_ioctl(drive, cmd, arg);
...
}
}
EXPORT_SYMBOL(generic_ide_ioctl); // 요건 밖에서도 이 함수 사용할 수 있도록 끄집어 내 놓은것.
#### 아~ 여기서 부터는 trace를 하긴 했는데, 잘 모르겠네. 호호호호~~ =33
ide-taskfile.c
1. ide_cmd_ioctl( )
2. ide_wait_cmd( )
ide-io.c
ide_do_drive_cmd( )
{
blk_put_request(rq); // driver/block/ll_rw-blk.c
}