저자: 마이클 루카스, 역 신동섭
어떤 용어에 대해 듣고 난 후에야 그 기술을 갈고 닦게 되는 경우가 있는데 이에 해당하는 용어가 바로 "디스크라벨(Disklabel)"이다. 일단 동작중인 시스템을 가지고 있다면 디스크라벨(disklabel)에 대해 걱정할 필요가 없다. 대부분의 BSD 운영체제는 인스톨 과정동안 디스크라벨(disklabel) 세부사항까지 다루며 새로운 사용자들이 더 편리하게 생활할 수 있게 해주기 때문이다. (OpenBSD는 실제로 사용자를 디스크와 연결되도록 해준다. 그러나 이는 예외 사항이다.) 그러나 어느날 갑자기 고장이 나버릴 경우 어쩌면 디스크라벨에 대해 알아둘걸… 하고 후회할 수도 있다.
i386 컴퓨터 시스템에는 두 개의 다른 파티션이 있음을 발견하게 될 것이다. 하나는 마이크로소프트형 파티션이고 다른 하나는 BSD형 파티션이다. 마이크로소프트형 파티션은 FAT, NTFS 및 다른 것들에 의해 사용된다. FreeBSD에서는 파티션을 슬라이스라 부르며 마이크로소프트형 파티션 안에 자신의 파티션을 가진다. OpenBSD는 그 파티션들을 직접적으로 디스크에 넣으며 이는 전체디스크를 하나의 단일 슬라이스로 사용하는 효과가 있다. 다른 BSD는 이러한 기술들 중 몇 가지 다른 것을 사용한다.
우선 디스크라벨(disklabel)이 무엇인지부터 살펴보자. 디스크라벨(disklabel)은 각 BSD형태 파티션이 어디서 시작하고 얼마나 많은 디스크 섹터를 가지는가를 표시하는 디스크 시작점에 있는 파일이다.
다른 BSD에서 여러분은 disklabel(8)을 가진 디스크라벨을 읽을 수 있다. 단지 지금 디스크라벨을 실행하고 그 디바이스에 이름을 붙이자. 하드 디스크에 첫번째 적법한 디스크의 디스크라벨(disklabel)을 주는 것이 바로 기본이다.
$ disklabel ad4
# /dev/ad4s1c:
type: ESDI
disk: ad4s1
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 4864
sectors/unit: 78156162
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 204800 0 4.2BSD 1024 8192 16 # (Cyl. 0 -
12*)
b: 2104592 204800 swap # (Cyl. 12*-
143*)
c: 78156162 0 unused 0 0 # (Cyl. 0 -
4864*)
e: 4194304 2309392 4.2BSD 1024 8192 16 # (Cyl. 143*-
404*)
f: 71652466 6503696 4.2BSD 1024 8192 16 # (Cyl. 404*-
4864*)
#
위의 코드에서 보이는 대부분의 정보는 명백하다. 섹터 하나는 최소 디스크 양(a minimal chunk of disk)이다. 이 디스크에 있는 각 섹터는 512byte나 0.5Kbyte 정도를 가진다. 우리는 실린더 마다 얼마나 많은 트랙과 섹터들이 있는지, 얼마나 많은 실린더들이 있는지 등등을 볼 수 있다. 또한 RPM으로 디스크 속도도 볼 수 있다. 디스크라벨(disklabel)의 실제 요점은 마지막 섹터의 chunk에 있다. 이는 다양한 파티션과 특성들을 목록화 해준다.
우선 그 디스크가 지원할 수 있는 파티션 수를 보게 되는데, 이 특정 디스크가 다섯 개의 파티션들을 가지는 반면 디스크라벨(disklabel)은 8개까지 지원된다는 것을 보여준다.
마지막 섹션에서 중요한 것은 초기 문자, 크기, 오프셋, fstype이다. 이밖에 모든 것은 soft update를 가진 현대적이고 빠른 파일시스템에서는 무시된다. (여러분은 soft update를 사용하고 있는가?)
각 문자는 하나의 파티션을 나타낸다. "a"는 전형적인 루트 파티션이다. "c" 파티션은 전체 디스크를 나타낸다. 각각의 파티션 문자는 특정 파티션 타입으로 할당되며 이것은 BSD들에 변화를 준다.
a = root
b = swap
c = whole disk
d = obselete whole disk
e-h = everything else
각 파티션은 디스크에 관한 섹터들을 가진다. "size"가 하나의 파티션이 차지하는 섹터 수를 말하는 반면, 오프셋(offset)은 현재 파티션을 선행하는 섹터 수를 말한다. 마지막으로 fstype은 이 파티션이 사용하는 파일시스템이 어떤 종류인지를 말해준다. 대부분의 UFS(Unix File System) 파티션들은 4.2BSD fstype를 가진다.
예를 들어, 위의 스니핏(snippet)에 있는 파티션 "a"는 0의 오프셋에 있다. 이것은 그 디스크에 있는 첫번째 파티션에서 기대하는 것이다. 이 파티션은 204800섹터로 채워진다. 우리는 여기 컴퓨터 세계에 있고 0에서 숫자를 시작하기 때문에 파티션 "a"에 있는 마지막 섹터의 숫자는 204799이다. 다시 그것은 하나의 UFS파티션이며 그래서 4.2BSD타입을 가진다.
파티션 "b"는 204800의 오프셋에서 시작하며 2104592섹터를 가진다. 이것은 아주 간단해 보인다, 그렇지 않은가? 204800+2104592=2309392이기 때문에 파티션 "c"가 2309392섹터에서 시작할 것이라고 생각할 수도 있다. 그렇지만 파티션"c"는 루프를 돌릴 것이다.
"c"는 0의 오프셋에서 시작한다. 그리고 그 크기는 78156162가 된다. 이것은 아주 무의미하게 보인다. 여러분은 오버래핑 파티션들이 불량이라고 생각하여 파티션 "c"을 제외하고 모든 것을 정정해야겠다고 생각할 수도 있다. "c"는 전체 디스크를 대표하는 특별한 파티션 임을 기억하라. 그 디스크는 오프셋 0에서 시작하기 때문에 파티션 "c"도 거기에서 시작한다. 마찬가지로 전체디스크는 78156162섹터를 가지며 따라서 파티션 "c"와 같은 크기이다. 파티션 "c"는 몇 개의 섹터가 비어있는가를 이중점검 하는데 유용하다. 그러나 디스크를 나누는 방법 발견하면 이를 무시할 수 있다.
예제에서 파티션 "e"와 "f"는 a와 b에 의해 만들어진 패턴을 따른다.
이것이 모두 좋다고 하더라도 실제 세계에서 이를 어떻게 사용할 수 있을까?
나의 FreeBSD 랩탑 하드 드라이브는 4개의 슬라이스가 있다. 하나는 기본적으로 사용하지는 않지만 파티션으로 나누어져 있다. 위의 예는 그 슬라이스로부터 기인한다. 나는 그 슬라이스 /dev/ad0s2를 하나의 큰 단일 파티션으로 변경하고 싶다. FreeBSD에서는 이 작업을 하기 위해 sysinstall(8)을 사용할 수 있었다. 다른 운영체제, 다른 BSD 운영체제에서 조차도 sysinstall은 옵션이 아니다. 게다가 명령라인을 이용하는 것은 훨씬 더 힘든 일이라고 생각되지 않는가?
시작해 볼 것을 고려하기 전에 시스템을 비롯하여 중요한 데이터를 모두 백업해라. 만약 디스크를 변경해보려는 시도를 하다가 데이터를 잃어버린다면 이에 대한 책임을 질 사람은 여러분 말고는 아무도 없다. 다시 정렬한 파티션의 모든 데이터를 지울 것이기 때문이다!
우선 나중에 그 시스템을 방해하지 않도록 확실히 해두는 것이 좋다. /etc/fstab에서 그 슬라이스에 여러분이 편집하고자 하는 파티션들을 위한 모든 엔트리들을 제거해라.
디스크라벨(disklabel)을 좀 더 세밀하게 관찰하면 잊고 있던 것이 보일 것이다. 파티션 b는 그 시스템의 스왑공간이다! 이 특별한 시스템은 자주 호출하는 것은 아니기 때문에 약간의 스왑 공간이 필요하다. 이것은 단지 약간 어렵게 만들 뿐이다. 나는 스왑 파티션과 UFS파티션이 필요하다.
변화를 주기 전에, 변화를 주고 싶은 것에 대한 계획부터 세워라. 내 경우에는 350MB 스왑 "b"파티션을 원하며 그 외 모든 것들은 단일 데이터 파티션 "e"가 되어야 한다.
우리는 512byte 섹터들을 계산하고 그런 방법으로 350MB스왑 파티션을 계산해야 한다. 그러나 디스크라벨(disklabel)이 K,M,G약어를 인식한다. 이외에도 "모든 나머지"를 의미하는 *나 고정된 파티션 크기를 할당한 후에 남은 공간을 퍼센트로 나타내주는 %를 인식한다. 이를 결합하여, 우리는 이것처럼 보이는 새로운 디스크라벨(disklabel)을 원한다. "c" 파티션이 완전한 슬라이스를 나타내기 때문에 우리는 그것을 건드리지 않은 상태로 두기를 원한다.
# size offset fstype [fsize bsize bps/cpg]
b: 350M 0 swap
c: 78156162 0 unused 0 0
e: * * 4.2BSD 1024 8192 16
#
일단 슬라이스를 마운트하지 않으면 디스크라벨(disklabel)의 -e플래그를 사용하여 편집할 수 있다. 디스크라벨(disklabel)을 편집할 때 단일 사용자 모드이어야 함을 조심하라. 어떠한 것을 바꾸기 전에 백업된 것을 이중 점검해야 한다!
단일 사용자 모드에서 다음을 실행하자.
# disklabel -e ad0s2
그 안에 완전한 디스크라벨(disklabel)을 가진 텍스트 편집기를 생성한 후 버튼에 필요한 변경을 한다. 지금
newfs /dev/ad0s2e을 할 수 있고 새로운 파일시스템을 생성할 수 있다. 그 결과 나는 새로운 스왑 공간과 파일시스템에 대한 내용을 그 시스템에게 알려주기 위해 /etc/fstab을 편집하고 다중 사용자 모드로 부팅한다.
단지 몇 가지만을 편집하면 자신이 원하는 대로 파티션을 변경할 수 있다. 비록 디스크라벨(disklabel)이 위험하게 보일지라도 일단 디스크라벨(disklabel)에 대한 기본을 이해하고 나면 곧장 잘 풀리게 될 것이다.
마이클 루카스(Michael Lucas)는 아내 리즈와 함께 애완동물을 키우면서 미시간주 디트로이트에서 살고 있다. 자기가 가진 모든 문제는 Great Lakes Technologies Group이라고 하지만 어쨌든 그곳에서 네트워크 설계자로 일하고 있다.