[홈으로] [게시판]

Software Suspend

차례 [+]

무엇일까?

이것은 hibernation이라고도 부르고 한글 윈도에서는 '최대 절전 모드'라고도 부르는 기능인데, 컴퓨터의 현재 상태를 전부 하드디스크에 저장하고 다음 부팅때 이것을 읽어들여 이전 상태로 복원하는 것입니다.

부팅과 셧다운에 걸리는 시간이 엄청나게 줄어드는 것도 편리하지만, 무엇보다 마지막 작업하던 상태 그대로 복원되기 때문에 개인용 컴퓨터라면 아주 필수적인 기능입니다.

hibernate 진입후 복귀한 화면: 그동안 별의별 많은 일이 있었지만 :) 성능 떨어지는 노트북이라 죽었다 깨나는데 1분 30초나 걸렸습니다. time은 자기가 죽었던 것도 모르고 깨나서 시간을 계산했습니다.

준비

이 기능은 Software Suspend라는 이름으로 커널에 포함되어 있는데(2.6부터) 포함되어 있는 것은 컴퓨터 BIOS의 기능에 의존하는 것입니다. 여기서 하려는 것은 Software Suspend 2인데, 이것은 BIOS에 의존하지 않고 여러가지로 더 편리합니다. 아직 커널에 포함되어 있지 않기 때문에 패치가 필요합니다.

커널 패치

지금 시점에서 커널 2.6.9에 적용되는 버전 2.1.5가 최신입니다. 일단 커널 2.6.9의 소스가 필요하겠고, 다음 사이트에서 커널 2.6.9용 2.1.5 버전 패치를 받습니다. http://swsusp.sf.net (http://softwaresuspend.berlios.de/)

다운 받아보면 커널 패치를 자동으로 해주는 스크립트가 있습니다. 커널 소스 트리의 맨위에서, apply 스크립트를 실행시키면 됩니다.

 /usr/src/kernel-2.6.9# ~/software-suspend-2.1.5-for-2.6.9/apply

커널 설정

커널 설정 과정에서 power management 섹션에 software suspend 2라는 항목이 새로 생겨있으면 된 것입니다. 세부 항목들을 살펴보면 몇가지 기능들이 있는데 디버깅 관련 항목 말고는 모두 선택해줍니다(지금 기억이 안난다-_-). 특히 텍스트 모드 서스펜드 지원 항목에 꼭 체크합니다. 이 기능을 켜주면 서스펜드 진입할때와 복귀할때 상당히 진지하고 세련된 화면을 텍스트 콘솔로 보여줍니다.

그리고 커널 설정 과정에서 usb 관련 기능을 모두 모듈로 만들어두는 것이 좋습니다. 알려진 문제점으로 usb와 pcmcia에서 서스펜드 복귀시에 장치 초기화에 실패하면서 그대로 '시스템이 얼어버리는' 상태가 되는 경우가 있는데 usb의 경우에 hibernate 스크립트에서 관련 문제가 보고된 장치의 모듈은 일단 내리고 서스펜드 진입후 복귀시에 다시 모듈을 적재하는 방법으로 문제를 피해가고 있습니다. 그런데 아직 pcmcia는 문제를 피해갈 뾰족한 방법이 없는 모양입니다. 혹시 내 시스템에서는 이런 번거로운 과정없이 잘될지도 모르니까, 삽질할 여유가 있다면 여러가지로 테스트해보는 것도 좋겠습니다.

[참고]

가상 콘솔 기능을 커널에서 빼지 마세요. software suspend가 가상 콘솔을 사용합니다.

[참고]

initrd를 사용한다면 software suspend 기능을 모듈로 만들어도 된다고 합니다.

커널 컴파일

컴파일하고, 설치합니다.^^ 그런데 이대로는 리부팅을 한다고 해도 서스펜드가 동작하지는 않습니다. 그래도 다음단계를 위해 리부팅합니다.(살아 돌아오길 빕니다;)

서스펜드 파일 만들기

Software Suspend 2는 스왑 파일이나 스왑 파티션에 시스템 정보를 저장합니다. 아무래도 스왑 파일이 여러가지로 편리하니까, 이 방식을 사용하는게 좋겠습니다.

스왑 파일은 다음과 같이 생성합니다.

 # dd if=/dev/zero of=/suspend bs=4096 count=XXXXX

이렇게 하면 시스템 루트에 suspend란 이름이 파일이 '4 곱하기 XXXXX' 킬로바이트 크기로 생성되어 있을 것입니다. 파일의 크기는 갖고 있는 실제 메모리량과 같게 잡으면 됩니다. 예를 들어 128M 메모리가 장착되어 있다면 XXXXX 값은 얼마가 되어야 하겠습니까? -_- 암튼 계산해서 XXXXX 값을 맞게 넣어주면 됩니다.

다음 명령으로 이 커다란 파일을 스왑 파일로 만듭니다.

 # mkswap /suspend

임시로 이 파일을 스왑 공간으로 할당합니다.

 # swapon /suspend

한편으로 기존 사용하고 있는 스왑의 크기도 중요합니다. 스왑이 부족하면 suspend 진입을 하기 위한 필요한만큼의 실제 메모리를 비울 수가 없기 때문에 진입에 실패하게 됩니다. 스왑 사용량이 실제메모리 0.5배 이상으로 많은 편이라면 스왑을 좀더 넉넉하게 (실제 메모리 2배 정도) 잡아둡니다.

커널에 suspend 파일의 위치를 알려주기

앞서 커널 컴파일과 리부팅 과정에서 문제가 없었다면, /proc/software_suspend 라는 디렉토리가 생성되어 있어야 합니다. 또한 앞서 서스펜드용으로 만들었던 스왑 파일이 현재 시스템의 스왑으로 잡혀 있어야 합니다. 모든 과정이 잘 되었으면 /proc/software_suspend/headerlocations 파일의 내용을 봅니다.

  # cat /proc/software_suspend/headerlocations

잡혀있는 스왑 파일의 정보가 보입니까? 대략 'swap:/dev/hda2:0x123@1024' 형태의 정보가 보여야 합니다.(자세한거 기억안남-_-) 기존의 스왑 공간과, 앞서 잡아두었던 suspend 스왑 파일의 정보가 구분되어 보일 것입니다. 이 정보는 suspend 스왑 파일의 위치를 나타내주는데, 이것을 부팅시 커널에 알려주어야합니다.

이 방법은 사용하는 커널 로더에 따라 달라집니다. lilo라면 /etc/lilo.conf 파일을 수정한뒤 lilo를 재실행해야 할 것이고 grub이라면 menu.lst 파일을 편집해야 합니다. 어쨌건 공통적으로, 부팅시 커널의 인자로 다음을 넣어주어야 합니다.

 resume2=swap:/dev/hda3:0x123@1024

물론 위의 정확한 숫자는 아까 확인한 자신의 suspend 파일의 것으로 넣어주어야 합니다.

리부팅

그리고 리부팅합시다. 부팅중 'software suspend가 normal swap 파일을 인식했다'는 내용이 살짝 스쳐보이면 성공입니다.

해보기

스크립트 설치

이제 hibernate 스크립트가 필요합니다. 현재 데비안에는 0.99버전이 올라와 있는데 이것은 최신 2.1.5 버전에는 맞지 않습니다. 아까 거기서 꼭 1.0 버전을 설치해야 됩니다(중요).

설정

스크립트에 특별한 설정은 필요없지만, X를 사용하는 경우에 중요한 옵션으로 LeaveX 라는 것이 있습니다. 아마 /etc/hibernate/hibernate.conf 같은 위치의 파일이 있습니다.(기억 안남-_-) 여기에 LeaveX 인가 하는 설정을 꼭 주석 해제합니다. 이 기능으로 X가 뜬 상태에서 서스펜드 진입시 자연스럽게 텍스트 모드 애니메이션으로 전환되고, 복귀할때는 다시 텍스트 모드 애니메이션에서 다시 X로 돌아옵니다.

죽여봅시다.

이제 죽여봅시다.

 # hibernate

어떻습니까? 잘되었습니까?

잘된다면 X에서 일단 텍스트 콘솔로 전환되고, 간략하게 진행 상태와 진행률이 표시되고, 마지막으로 셧다운됩니다. 제대로 되지 않는다면 -v 옵션으로 자세한 진행 상황을 살펴보거나 dmesg를 들여다 볼 필요가 있습니다.

살려봅시다.

전원을 킵니다. 어떻습니까? -_-;

일단 초기 부팅을 진행하다가 복귀 진행상태와 진행률이 표시되고, X로 깨끗하게 돌아오게 됩니다.

파워 버튼 설정

잘된다면, 시스템이나 노트북의 파워 버튼을 눌렀을 때 hibernate 명령이 자동 실행되도록 하면 편리하겠습니다. acpid 설정에서 단순히 설정하면 됩니다. :)

문제점

진입시 문제점

async_io_limit

서스펜드 진입시에 충분한 스왑이 잡혀있는데도 '페이지'가 부족하다는 에러를 뿌리면서 진입에 실패한다면 /proc/software_suspend/async_io_limit 값을 128로 늘려보세요.

잘됩니까? 그렇다면 hibernate 스크립트 맨 첫 줄에 적어두면 되겠네요.

echo 128 > /proc/software_suspend/async_io_limit

복귀시 문제점

X가 깨져요.

hibernate 스크립 설정에 LeaveX라는 항목을 주석 지우세요.

pcmcia

yanta-socket이라는 하는 이 장치에 문제가 생기면 별 뾰족한 수가 없는 모양입니다. 다만 처음 복귀 시도에서 '얼어버린 후' 강제로 리셋하면 다시 서스펜드 진입 할건지 정상 부팅 할 것인지 묻는데 여기서 다시 서스펜드 진입 시도하면 성공하기도 합니다. 이 경우 장치 초기화에서 뭔가 타이밍이 맞지 않는다는 인상을 주는데.. pcmcia가 필요하지 않으면 아예 커널에서 빼버리거나, 아니면 커널 옵션을 여러가지로 바꿔보면서 테스트해봅니다.

개인적인 경험으로는, 계속 진입에 실패하다가 '갑자기' 성공하기 시작해서 계속 잘되는데 아직도 이유를 모르겠습니다. 갑자기 기계가 정신을 차렸나봅니다.

usb

ohci니 하는 것들이 문제를 일으키는 경우도 있지만 아닌 경우도 있다고 합니다. 어쨌든 모듈로 만들어 두면 hibernate 스크립트가 알아서 처리해주니까 걱정할 것은 없습니다.

참고할곳

http://softwaresuspend.berlios.de

으음

어떻습니까? 어쨌든 살아있다면 걱정할 것은 하나도 없습니다. 앞으로 이것을 좀더 재미있는 스토리로 만들어 봅시다.

제일 위로
최종 수정 일시: 12월 01일(2004년) 02:07 PM 편집 | 정보 | 차이 | 비슷한페이지 | DebugInfo
유용한 페이지들: 분류 분류 | 자유로운 연습장 SandBox | 무작위 페이지들 RandomPages | 인기있는 페이지들 MostPopular