[unix] 하드 디스크 에라 숨기기

하드 디스크 에라 숨기기

하드 디스크를 오래 사용하게 되면 에라가 나게 된다. 파일 시스템이 엉키는 간단한 것이라면 디스크 검사로 해결이 된다. 불량 섹터가 났을 때 도스나 리눅스 포맷으로 해결 되기도 한다. 이렇게 운 좋은 경우는 불안하지만 별 어려움 없이 사용 할 수가 있다. 어려운 것은 하드 디스크가 물리적인 에라가 났을 때이다. 물론 이 것도 로우레벨 포맷 프로그램이나 바이오스의 하드디스크 포맷으로 해결하는 경우도 있다. 이것은 그 섹터를 베드라고 설정하고 사용하지 않는 방법을 쓰는 것이다. 가장 심각한 것은 논리 포맷 프로그램과 로우레벨 포맷 프로그램이 실행 중에 에라가 난 부분에서 더 이상 진행하지 못하고 중단 되는 경우이다. 이 때에는 에프터 서비스를 받아야 한다.

에프터 서비스가 문제가 없다면 좋겠지만 종종 판매한 곳을 찾을 수 없어서 이 것이 불가능하거나 고치는 비용이 오히려 중고 가격을 능가하는 경우가 많다. 어쩔 수 없이 하드디스크를 폐기 처분해야 하는 것이다. 하드디스크가 완전히 고장나서 인식조차 되지 않을 때라면 더 이상 이야기 할 것이 없지만 만일 하드디스크의 일부 섹터가 물리적인 에라가 나서 정상작동을 하지 않는 경우라면 해결 방법이 있다.

리눅스의 mke2fs/badblocks 프로그램은 직접 하드디스크와 교신하기 때문에 하드 디스크의 물리적 에라에도 불구하고 끝까지 검사를 한다. 도스 포맷과 바이오스 포맷 은 맵핑하거나 베드섹터라고 표시할 수 없는 에라가 났을 때 포맷자체를 중단해 버리기 때문에 에라난 부분을 찾거나 그 부분의 크기를 알 수 없지만 리눅스에서는 이 부분을 정밀하게 찾아 낼 수 있다. 그렇다면 리눅스에서 하드디스크를 모두 조사하여 에라난 부분을 제외하고 파티션을 한다면 하드디스크의 용량을 크게 잃지 않고 안전하게 재활용 할 수가 있게 되지 않겠는가? 이렇게 할 수 있는 것은 하드디스크의 물리적 에라는 일시적인 충격에 의해서 일부분의 섹터가 긁혀 생기는 경우가 많기 때문이다.

이물질이 들어갔다면 물론 지속적으로 베드가 증가하게 되니까 이렇게 해도 쓸 수는 없을 것이다.

자 이제 하드디스크를 재활용할 수 있는 경우를 정리해 보자. 하드디스크가 인식은 되지만 베드섹터가 났거나 포맷이 안되며 에프터서비스를 받을 수 없는 상황이다. 하드디스크의 일부분이라도 살려서 사용하고 싶다. 이럴때 리눅스가 어떻게 도와 줄 수 있는가? 필자의 스카시 하드디스크가 일부 섹터가 에라가 났다. 이 것을 살려낸 과정을 보이기로 한다. 우선 리눅스 fdisk 프로그램을 이용해서 전체를 리눅스 파티션으로 잡았다.

# fdisk /dev/sda

Disk /dev/sda: 17 heads, 62 sectors, 1020 cylinders
Units = cylinders of 1054 * 512 bytes

Device Boot Begin Stat End Blocks Id System
/dev/sda1       1    1 1020 537509 83 Liux native

fdisk 사용법은 m이라고 치면 자세하게 나온다.

주로 쓰는 것은 d(지우기), n(추가하기), t(ID 바꾸기), a(부트 파티션 설정하기), w(변경사항 실제로 쓰기) 등이다. 명령마다 간단한 메뉴가 나오기 때문에 사용에 어려움은 없을 것이다. 에라난 디스크를 다루고 있으므로 걱정하지 말고 명령을 시험해 보기 바란다.

이 글은 fdisk 사용법에 대한 글이 아니다. 명령 사용법은 스스로 조사해 익히기 바란다. 앞으로도 자세한 명령 사용법은 언급하지 않을 것이다.

실린더가 1020, 실린더당섹터가 62, 헤드수가 17개이며 리눅스 섹터는 512바이트이므로 모두 곱하면 약 540M 가 된다. 이 중 일부 섹터가 에라가 나서 전체를 쓸 수 없게 된 것이다. 어느 부분이 에라가 났는지 살펴보자.

# mke2fs -c /dev/sda1


Checking for bad blocks (read-only test):

Current error sd08:01: sense key Medium Error
Additional sense indicates Unrecovered read error
Scsidisk I/O error: dev 08:01, sector 1092, adsolute sector 1154
scsi0: MEDIUM EROR on channel 0, id0, lun0, CDB: Request Sense 00 00 00 10 00


Current error sd08:01: sense key Medium Error
Additional sense indicates Unrecovered read error
Scsidisk I/O error: dev 08:01, sector 414286, adsolute sector 414348
scsi0: MEDIUM EROR on channel 0, id0, lun0, CDB: Request Sense 00 00 00 10 00

필요한 부분을 제외하고는 모두 생략했다. mke2fs의 -c 옵션은 badblock 프로그램을 부른다. 이 프로그램은 물리섹터를 조사해 불량 유무를 조사하는 프로그램이다. 화면에서 물리 섹터 1154와 414348 부분이 에라가 났다. 실제로는 1154부터 약 300개 414348부터 약 100개 정도의 불량섹터가 있었다. 편의상 생략한 것이다.

불량섹터는 불량섹터를 부른다. 불량섹터 큰처를 억세스하게 되면 하드디스크의 이상 동작으로 계속 이 것이 증가하는 경향이 있다. 그러므로 가능하다면 불량섹터를 중심으로 어느 정도의 여유를 두고 이를 제외한 파티션을 한다면 불량섹터가 증가할 가능성이 적어진다. 이 하드디스크의 섹터수를 2로 나누면 그 부분의 위치를 1k바이트 단위로 알 수 있다. 위에서 1154섹터는 577k 바이트 부근이며 414348섹터는 207174k 바이트 부근이다. 이제 이 곳을 제외한 파티션을 새로 해 보자

# fdisk /dev/sda


Device    Boot  Begin  Stat   End   Blocks Id  System
/dev/sda1   *       3     3   380   199206  6  DOS 16-bit >=32M
/dev/sda2         421   421  1020   316200  6  DOS 16-bit >=32M  

이 디스크의 실린더는 1020이므로 1실린더가 약 500K 정도이다. 첫번째 베드섹터를 피하기 위해서 첫번째 파티션은 실린더 3부터 시작했다. 두번쩨 베드섹터가 200M 근처에 있으므로 앞뒤로 1-2메가 정도의 여유를 두었다. 화면에서 보듯이 도스에서는 두번째 파티션을 확장파티션으로 설정해야 하지만 리눅스에서는 아무 상관이 없다.

이렇게 만든 파티션도 윈도우에서 문제 없이 쓸 수 있다. 물론 이렇게 쓰기 위해서는 첫번째 파티션을 부트가능하게 만들어야 한다. 불안하다면 두번째 파티션을 ID 5번 확장 파티션을 만들고 도스 fdisk 프로그램으로 그 안에 논리 드라이브를 만들면 된다.

fdisk에서 파티션을 변경하는 것은 d로 지우고 n으로 추가하고 t로 아이디를 바꾸는 작업이다. ID 값을 알고 싶으면 l이라고 치면 된다. 조금만 해 보면 쉽게 모든 조작을 할 수 있을 것이다. 필자는 특수한 경우를 위해서 스카시 하드 디스크를 예로 들었지만 IDE 하드 디스크도 마찬 가지이다. 첫번째 IDE 디스크는 hda, 두번째는 hdb라는 이름을 가진다. 도스의 C:,D:와는 개념이 다르기 때문에 주의해야 한다. 에라난 디스크를 다룬다고는 하지만 무척 중대한 작업이니까 리눅스에 대한 이해가 조금은 있는 사람과 함께 하거나 스스로 리눅스에 대한 이해를 한 후에 도전하기 바란다. 리눅스에 대한 이해를 위해 필요한 모든 정보는 쉽게 구할 수 있고 무료이기 때문에 어렵지 않을 것이다. 리눅스에 대해 알고 있는 것이 앞으로 많은 도움이 될 수 있다.

요즘 같이 어려운 시기에 하드디스크 하나도 아쉬운 상황이므로 이 방법을 사용해 볼만하다. 이 하드디스크의 전체 용량에서 약 5메가 바이트 정도만 손해보고 정상적 으로 사용할 수 있으니까 좋은 일이다. 물론 리눅스를 인스톨 해서 쓴다면 더욱 좋겠지만 그건 사용자 마음에 달려 있는 일이다. 참고로 이렇게 쓰는 하드디스크는 중요한 시스템 디스크로 사용하기 보다는 보조적인 용도로 쓰는 것이 좋을 것이다.

하드디스크 청소하기
하드 디스크를 여러 컴퓨터에 옮기며 사용하다 보면 특이한 문제가 생기는 경우가 있다. LBA모드 등에 대해서 롬바이오스가 잘못 판단하는 경우 등인데 한 컴퓨터에서 LBA 모드로 포맷해서 사용하다가 다른 컴퓨터에 연결했을 때 하드디스크의 설정이 LBA로 보이지 않거나 이렇게 강제로 설정해도 부팅 후에 바뀌거나 도스 fdisk 프로그램이 제대로 디스크 용량을 인식하지 못하고 엉뚱한 크기로 파악하는 경우등이다.

이 것은 근본 원인을 알 수 없지만 하드디스크의 마스터 부트 섹터가 이상이 있거나 LBA 모드를 파악하는 방법이 컴퓨터 바이오스에 따라서 제대로 적용되지 않을 때 문제가 생기는 듯하다. 원인은 알 수 없지만 일반적으로 이런 경우에는 간단한 방법이 있다.

리눅스 플로피로 부팅해서 다음 명령을 실행해보자.

# cat /dev/zero >/dev/hda

이 명령은 0을 하드디스크 전체에 쓰는 명령이다. 리눅스는 하드디스크를 물리적인 스트림의 저장체로 보기 때문에 이 명령은 하드디스크의 물리적인 영역 모두에 0을 쓰게 된다. hda는 마스터 부트 섹터부터 하드 디스크 끝까지를 의하며 hda1은 하드 디스크의 첫번째 논리적 파티션이 점유하고 있는 물리적 파티션 전체를 의미한다.

그러므로 위의 명령은 물리적 하드 디스크 전체를 0으로 초기화 하는 것이다. 이 명령을 실행하고 나면 파티션 정보를 포함한 모든 내용이 지워진다. 이제 바이오스에서도 하드디스크의 용량을 제대로 잡을 수 있고 도스 포맷에서도 문제가 없을 것이다.

이렇게 처리한 하드 디스크에 대해서 도스에서 꼭 해야 할 것이다. 마스터 부트 섹터를 초기화 했기 때문에 파티션을 새로 잡아도 부팅되지 않는다. 이럴 때 리눅스 사용자만이 알고 있는 다음과 같은 도스 명령을 사용해야 한다.

a:> fdisk /mbr

리눅스 사용자 사이에서는 아주 유명하지만 윈도우 사용자는 한 번도 본 적이 없을 것이다. fdisk /? 를 사용해도 나오지 않기 때문이며 도스만을 사용한다면 전혀 쓸 일이 없는 옵션이기 때문이다.

이 옵션은 하드 디스크 마스터 부트 섹터의 파티션 정보를 제외한 모든 부분을 새로 쓰게 된다. 컴퓨터에 붙어 있는 첫번째 하드 디스크에만 사용 할 수 있기 때문에 이 명령을 실행해야 할 하드 디스크는 반드시 첫번째로 연결해 놓아야 한다. 이 명령은 다른 용도로도 사용할 수 있는데 예를들어 마스터 부트 섹터에 존재하는 바이러스를 잡을 때도 쓸모가 있다.

회사에서 보안이 필요한 정보가 담긴 하드디스크를 관리하기 위해서 여러 가지 방법이 있을 수 있다. 이런 하드디스크를 다른 용도로 사용하려고 할 때 단순히 파일을 지우기 만 해서는 안된다. 지운 파일을 살리는 프로그램이 있기 때문이다. 이렇게 해서 정보를 빼내지 못해도 하드 디스크를 섹터 단위로 읽게 되면 정보를 쉽게 가져 갈 수 있다. 이럴 때 위에서 말한 “cat /dev/zero >/dev/hda” 명령을 사용하면 좋다. 하드 디스크의 파일 시스템이 모두 없어질 뿐만 아니라 모든 섹터가 완전히 0으로 초기화 되기 때문이다.

시디롬 읽기

윈도우는 아직 도스의 그늘에서 자유롭지 못하다. 새로 산 하드 디스크를 연결하고 윈도우를 인스톨하기 위해서 하드 디스크를 포맷한 후에 시디롬을 인식 시키기 위해서 복잡한 방법이 필요하다. 도스 플로피를 만들고 config.sys와 autoexec.bat를 고쳐서 도스 플로피 부팅 후에 시디롬을 인식할 수 있도록 해야 한다. 도스 플로피를 만드는 작업, mscdex.exe 프로그램이 필요하고 config.sys등을 고쳐야 하며 장착된 시디롬에 맞는 디바이스 드라이버 또한 필요하다. 물론 이 디바이스 드라이버가 요구하는 적절한 옵션에 대해서도 알고 있어야 한다. 이렇게 하지 않고 하드 디스크를 윈도우가 설치된 다른 컴퓨터에 연결하여 윈도우 시디롬에서 필요한 파일만 복사해서 인스톨하는 방법을 쓸 수도 있다. 이 방법을 위해서 두 컴퓨터를 분해하고 새 하드 디스크를 다른 컴퓨터에 연결하는 작업이 필요하다. 윈도우 복사를 위해서 새 하드 디스크를 연결한 컴퓨터에서는 시디롬을 세컨더리 마스터에서 슬레이브로 바꾸어야 하고 하드 디스크를 다시 인식 시켜야 한다. 불행히 여분의 전원 케이블이 없다면 일은 더욱 복잡해진다.

이렇게 컴퓨터에 대한 작업은 기대한 작업 시간과 복잡도가 증가하는 경향이 있다. “새 하드 디스크에 윈도우 인스톨 파일 복사하기”라는 간단한 작업을 수행하기 위해서 두 컴퓨터를 뜯고 전원 케이블을 구하러 다니거나 시디롬과 하드 디스크의 매치가 이상해서 불필요한 곳에서 시간을 소비하기도 하고, 도스 플로피를 만들어서 시디롬을 인식 시키려 할 때에도 필요한 디바이스 드라이버를 구하기 위해서 시디롬 제작 회사의 홈페이지까지 방문해야 하는 경우도 있다. 퇴근 1시간 전에 금방 끝냈 수 있을 것으로 보이는 이런 간단한 작업을 시작했다가 막차를 놓치는 경우가 허다하다.

리눅스가 어떻게 이런 상황을 쉽게 해결하게 해 줄 수 있을까? 리눅스 부팅 플로피로 간단히 해결가능하다. 리눅스는 IDE 시디롬에 대해서 단일한 디바이스 드라이버를 사용한다. 모든 IDE 시디롬이 장착된 위치에 따라 /dev/hdb   /dev/hdd 까지 명칭은 달라 지지만 마운트 해서 읽을 수 있다. 세컨더리 마스터는 /dev/hdc이다. 시디롬은 하드 디스크와는 달리 파티션 개념이 없기 때문에 hdc1,hdc2이런 명칭을 사용하지 않는다.

다음 작업으로 간단히 시디롬의 필요한 파일을 하드 디스크에 옮길 수 있다.

# mount /dev/hda1 /mnt
# mount /dev/hdc /mnt2 -o ro
# mkdir -p /mnt/backup/win95
# cp -a /mnt2/win95/* /mnt/backup/win95

얼마나 간단한 작업인가. 하드 디스크가 적다면 윈도우를 인스톨 한 후에 이 파일들을 지우면 그만이다. 도스 플로피를 만드는 작업에 비해서 작업 시간이 훨씬 적고 하드 디스크를 다른 컴퓨터에 옮기는 작업을 하지 않아도 되기 때문에 드라이버를 들고 컴퓨터를 열 필요가 없다. 퇴근 시간 전까지 윈도우 인스톨 뿐만 아니라 응용 프로그램까지 모두 설치해도 시간이 남게 되지 않을까? 오래된 시디롬은 사운드 카드에 업체마다 특별한 방식으로 연결되어 있다. 이런 시디롬이 회사안에 있다면 커널 컴파일을 새로 해서 그 시디롬에 대한 지원을 추가해 놓으면 필요한 때에 당황하지 않고 작업할 수 있다. 리눅스에서 이런 시디롬에 대한 지원은 좋은 편이다.

그렇다면 시디롬이 달려 있지 않은 컴퓨터에서는 어떻게 할 것인가? 도스에서라면 한가지 방법 밖에 없다. 하드 디스크를 분리해서 시디롬 달린 컴퓨터에 연결해서 필요한 파일을 복사해 오는 것이다. 이 방법은 위에서 말한 모든 문제가 생길 가능성이 있다. 네트웍이 가능하다면 다른 컴퓨터의 시디롬을 리모트로 사용할 수 있다. 윈도우가 정상적으로 동작한다면 문제가 없지만 문제는 언제나 가장 복잡한 상황에서 생기는 법, 지금과 같이 윈도우를 인스톨하는 등 자원 사용이 불가능 할 때에는 많은 시간을 소모 해야 한다. 굳이 도스를 사용하고자 한다면 다시 부팅 플로피를 만들고 도스용 네트웍 디바이스 드라이버를 구해야 하고 필요한 설정값을 알기 위해서 문서를 들여다 보아야 한다. 제 시간에 퇴근하기는 이미 글러 버리는 것이다. 이 것도 리눅스 부팅 디스켓으로 간단히 해결할 수 있다. 이 상황에서 리모트의 시디롬을 리눅스 플로피 만으로 읽어 들이는 방법에 대해서 설명한다. 우선 리눅스 플로피로 부팅한 후에 다음과 같은 명령을 내린다.

# cat /proc/net/dev
Inter-|   Receive                  |  Transmit
  face |packets errs drop fifo frame|packets errs drop fifo colls carrier
     lo:     18    0    0    0    0       18    0    0    0     0    0
   eth0:      0    0    0    0    0        0    0    0    0     0    0

여기에 보면 eth0 항목이 있다. 커널이 이더넷 카드를 제대로 인식한 것이다. 박스 기사에 리눅스 부팅 플로피가 지원하는 네트웍 카드 목록이 있으니 참고 하기 바란다. 만일 회사에서 사용하는 네트웍 카드가 이 목록에 없다면 커널 컴파일을 통해서 지원 하게 하면 된다. 회사원 중에서 리눅스를 사용하는 사람에게 부탁해서 시간이 있을 때 회사에서 사용하는 네트웍 카드에 대한 지원을 추가하기 바란다. 여분의 피시가 있다면 이 기회에 리눅스 박스를 하나 만들어 두면 더욱 좋다. 커널이 네트웍 카드를 인식 했다면 그 다음은 일사천리로 진행할 수 있다. 다음 명령을 사용할 것.

# ifconfig eth0 192.168.1.20
# route add -net 192.168.1.0

192.168.1.20은 임의로 만든 IP번호이다. 이 번호는 회사의 네트웍 중에서 여유가 있는 번호로 바꾸어야 한다. ifconfig는 네트웍 카드 eth0에 IP를 할당하는 명령이다. route명령으로 이 컴퓨터가 할당받은 IP가 속한 네트웍을 라우팅하도록 한다. 물론 이 번호도 회사에서 사용하는 실제 번호로 바꾸어야 한다. 네트웍 카드가 활성화되어 있고 시디롬을 사용할 윈도우 컴퓨터와 연결 가능한지 다음 명령을 사용해 본다.

# ping 192.168.1.20
   PING 192.168.1.20 (192.168.1.20): 56 data bytes
   64 bytes from 192.168.1.20: icmp_seq=0 ttl=64 time=0.4 ms

# ping 192.168.1.30
   PING 192.168.1.30 (192.168.1.30): 56 data bytes
   64 bytes from 192.168.1.30: icmp_seq=0 ttl=64 time=0.8 ms

192.168.1.30은 시디롬을 사용할 윈도우 컴퓨터의 IP번호이므로 실제 번호로 바꾸어야 한다. 문제가 없다면 패킷 전송 속도가 나올 것이다. 이제 윈도우 머신을 마운트하자.

# smbmount //win95com/d /mnt -I 192.168.1.30 -U someuser -P passwd

win95com은 랜메니저 위에서 사용하는 윈도우 박스의 이름이다. 윈도우 네트웍 설정에서 “컴퓨터 이름”에 해당하는 값이다. d는 공유하도록 설정된 시디롬이 할당받은 드라이버 이름이며 리눅스 플로피로 부팅한 컴퓨터의 /mnt에 마운트 된다. 플로피로 부팅했으므로 네임서버가 설정되어 있지 않기 때문에 -I 옵션으로 IP 값을 정확히 적어 주어야 한다. 뒤에 있는 것은 물론 윈도우 박스에 로그인할 때 사용하는 사용자명과 비밀번호 값이다. nobody나 비밀번호 없는 사용자로는 윈도우 박스를 마운트 할 수 없다.

사용자명과 이에 따른 비밀번호가 반드시 필요하다. 이제 리모트 윈도우 박스가 로컬의 /mnt 디렉토리에 마운트 되었다. 마치 로컬에 있는 시디롬처럼 사용이 가능하다.

그 후에는 앞에서 설명한 로컬 시디롬 운용과 마찬가지의 작업을 진행하면 된다.

한개의 플로피로 네트웍이 가능하고 리모트의 시디롬을 마운트해서 사용할 수 있다면 회사의 컴퓨터 운용에 많은 장점이 있을 것이다. 여기서는 시디롬에서 파일 읽어 오기에 대해서만 설명했지만 리모트 윈도우 박스가 마운트 가능하다면 수많은 일을 할 수 있다. 어떤 일이 가능할 것이지는 사용하는 여러분의 용도가 무엇인지에 달렸다.

출처 : http://iskim.intosea.com/linux-window-1.html#ss1.1

Loading