Linux

[Linux] fdisk 활용 외: 파티션 생성, 배드블록 검사, 파일시스템 생성

Posted 2014. 11. 19 Updated 2015. 04. 24 Views 8688 Replies 0
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

얼마 전 서버를 복구했는데, RAID1으로 사용하고 있는 디스크에 쌓여 있던 오류들이 드디어 문제를 일으켰습니다. 이번에 큰맘먹고 Ubuntu에서 CentOS로 옮겨 왔는데, Ubuntu에서 아무 문제가 없이 동작하던 디스크가 CentOS에서는 아예 마운트가 되지 않는 신기하고 골때리고 기가막히는 일이 벌어졌습니다.. ㅡ0ㅡ;;

디스크를 마운트하려고 하면 '논리적 블록 수와 물리적 블록 수가 불일치한다' 면서 명령을 거부하더라구요..

디스크를 포맷한 것은 아니기 때문에 R-Studio와 같은 데이터 복구 프로그램을 사용하면 데이터는 얼마든지 복구가 가능하겠지만, 이게 여간 귀찮은 일이 아닙니다. 디스크떼고 스캔하고 파일 일일이 찾아서 저장하고...그래서 CentOS에서 어떻게든 해결해 보기 위해 fsck를 열심히 돌렸는데, 도무지 해결될 기미가 보이지 않았습니다. 여전히 오류가 나면서 마운트가 되지 않았죠.

그러던 중 문득 "다시 우분투로 돌아가서 마운트를 해 보면 되지 않을까?" 라는 생각이 스쳤습니다. fsck를 좀 심각하게 돌리긴 했지만, 마운트가 될거라는 희망을 품고 라이브 USB로 부팅해 보았습니다.

결과는 -

마운트도 잘 되고, 모든 파일도 잘 살아있었습니다.

똑같은 ext4 파일 시스템인데 리눅스 배포판마다 파일시스템을 처리하는 방법이 조금 다른가? 라는 의문이 들긴 했지만, Ubuntu보다는 CentOS가 파일시스템을 다루는 방법에 있어서 더 정교하게 처리한다고 여기고 넘어가기로 했습니다.

여튼, 우분투 라이브 USB로 부팅해서 기존 디스크에 있는 파일들을 모두 복사해서 다른 디스크로 옮기고, 다시 CentOS로 돌아왔습니다. 혹시나 하고 이 문제의 디스크를 다시 마운트해 봤지만, 요지부동이더군요..ㅎㅎ

결국 이 디스크를 파티션 설정부터 다시 하고 백업한 데이터들을 옮겨놓기로 했습니다. 디스크를 다루는 작업은 서버를 세팅하는 초반에만 열심히 하고, 그 이후에는 거의 할 일이 없습니다. (괜히 건드렸다가 뻑날까봐?)

때문에 디스크를 다루는 관련 명령어들이 제게는 여전히 낮설게 느껴졌는데요, 이번 기회에 한 번 정리해 보기로 마음 먹고 로그인을 했습니다.

또 어쩌다 보니 서론이 길어졌네요. 요즘 갖은 삽질을 하느라 멘탈이 남아나지 않고 있습니다. 지난 주말에는 서버에 GITLAB을 설치하느라 진땀을 뺐네요..ㅎㅎㅎㅎ

여튼 본론으로 들어가도록 하겠습니다. -


파티션은 디스크를 나누는 작업이고, 파일시스템 생성은 각 파티션에 파일을 저장할 수 있도록 준비하는 작업입니다. 파일시스템 생성은 흔히 '포맷'이라고 불리기도 합니다.

여럿이서 피자를 먹으러 갔는데, 피자가 나오자마자 핫소스를 피자에 전부 뿌려버리면 다른 사람들이 싫어하겠죠. 피자를 나눠서 내가 먹을 조각을 가져온 다음 핫소스를 뿌리는 것이 맞는 순서일 것입니다.

이와 마찬가지로, 디스크 작업에서도 디스크를 나누는 파티션 작업을 먼저 하고, 다음으로 파일시스템 생성 작업을 수행해야 합니다.


파티션 생성 (fdisk)

fdisk는 디스크 파티션 관련 작업을 수행하는 명령입니다.

우선, 다음과 같이 -l 옵션을 붙여 실행해서 컴퓨터에 붙어 있는 디스크들의 목록을 확인합니다.

sudo fdisk -l

다음과 같이 실행해서 파티션 설정 모드로 진입합니다. sdX는 위에서 확인한 디스크 이름이며, sda, sdb, ..., 와 같이 명명됩니다.

sudo fdisk /dev/sdX

디스크를 명시해서 fdisk 명령을 실행하면 해당 디스크를 관리할 수 있는 대화형(Interactive) 모드로 진입합니다.

'm'을 입력해서 사용할 수 있는 명령어의 목록을 볼 수 있습니다. 여기서 사용하거나, 유용한 명령은 다음과 같습니다.

  • d : 기존 파티션 삭제
  • m : 명령 목록 표시
  • n : 새 파티션 생성
  • p : 파티션 정보 출력
  • q : 변경 사항을 적용하지 않고 종료
  • w : 변경 사항을 적용하고 종료

명령 목록에서 알아차린 분들도 계시겠지만, 이 명령은 여타 파티션 관리 프로그램들과 마찬가지로 변경 사항을 적용하고 종료하기 전까지는 설정한 내용들이 실제로는 전혀 적용되지 않습니다. 즉, 설정하는 중간에 뭔가 실수한 것 같다 또는 뭔가 찝찝하다 싶다면 'q'를 입력해서 빠져나갔다가 fdisk를 다시 실행해서 처음부터 다시 파티션 설정을 하면 됩니다.

우선, 처음부터 파티션을 다시 세팅할 것이므로 'd'를 눌러서 삭제 모드로 진입하고 모든 파티션을 삭제해줍니다.

그리고 'n'을 눌러서 새로운 파티션 생성 모드로 진입합니다. 그러면 바로 다음과 같이 알아듣지 못할 질문이 뜨게 됩니다. 여기서는 위에서 모든 파티션을 모두 삭제했으므로 p를 입력해서 primary partition 생성 모드로 진입하면 됩니다.

리눅스 시스템에서는 기본적으로 하나의 디스크당 최대 4개의 파티션을 정의할 수 있고, 그보다 많은 수는 확장 파티션으로 정의해야 합니다. 즉, 파티션이 4개 이하인경우 모두 Primary partition으로 정의하면 되고, 5번째 파티션 부터는 Extended partition으로 정의하면 됩니다.

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p

그러면 다음으로 파티션 번호를 물어봅니다. 아직 파티션이 하나도 없으므로 1을 입력합니다. 기존에 생성한 파티션이 있는 경우 이미 생성한 파티션 번호를 피해서 번호를 입력하면 됩니다.

Partition number (1-4): 1

이제 파티션의 시작 위치를 지정해야 합니다. 특별히 '내 데이터는 반드시 디스크의 특정 영역에 저장해야겠어!' 라는 생각을 갖고 있지 않다면, 그냥 Enter를 입력해서 기본값으로 처리하도록 합니다.

현재 파티션이 하나도 정의되어 있지 않는 상태인데도 default가 2인 이유는 첫 번째 실린더에는 파티션 테이블이 위치하기 때문입니다. 새로 정의하려는 파티션 앞에 이미 다른 파티션이 정의되어 있는 경우, 그 offset이 자동으로 계산되어 default에 나타나게 됩니다.

First cylinder (1-244189952, default 2):
Using default value 2

마지막으로 파티션의 크기를 지정해주도록 합니다. 주의할 점은, 여기서 그냥 숫자를 입력하면 마지막 실린더의 번호로 적용된다는 점입니다. 가장 많이 사용되는 용량으로 파티션의 크기를 지정하기 위해서는 +232G처럼 +기호 뒤에 용량과 단위를 명시해 주어야 합니다. 단위 없이 +232 이렇게만 쓰면 파티션의 실린더 크기가 232개로 설정됩니다.

Last cylinder, +cylinders or +size{K,M,G} (2-244189952, default 244189952): +232G

이렇게 하면 하나의 파티션을 정의한 것입니다. 제대로 정의되었는지 확인하려면, 'p'를 입력해서 확인해 보면 됩니다.

Command (m for help): p

Disk /dev/md126: 1000.2 GB, 1000202043392 bytes
2 heads, 4 sectors/track, 244189952 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x8c8b8b06

      Device Boot      Start         End      Blocks   Id  System
/dev/md126p1               2    60817410   243269636   83  Linux

이제 위 과정을 반복하며 필요한 갯수만큼 파티션을 생성하고, 마지막에 'w'를 입력해서 변경내용을 실제 디스크에 반영하도록 합니다.

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.


배드블록 검사 (badblocks)

배드블록 검사는 생성한 파티션에 데이터를 쓰고 읽는 데 문제가 없는지 검증하는 작업입니다. 물리적으로 의심이 가는 디스크는 본격적으로 디스크를 사용하기 전에 이 검사를 수행하는 것이 좋습니다.

단, 파티션의 크기에 따라 이 작업은 상당히 오래 걸릴 수 있습니다. 필요하지 않다고 판단되면, 이 과정을 건너 뛰어도 됩니다.

-v 옵션은 검사 과정을 자세히 출력하라는 뜻입니다.

sudo badblocks -v /dev/sdXN

badblocks 명령은 기본적으로 읽기 검사만 수행합니다. 여기에 -w 옵션을 주어서 쓰기 검사까지 수행할 수 있습니다. 단, 이 옵션을 줄 경우 디스크에 실제로 쓰는 작업을 수행해서 배드블록 검사를 하기 때문에 디스크의 모든 데이터가 삭제됩니다. 이에 유의하도록 합니다.

sudo badblocks -vw /dev/sdXN

저는 디스크 오류때문에 파티션 재설정 및 포맷을 하게 되었으므로, 시간이 오래 걸림에도 불구하고 꾸역꾸역 이 검사를 수행하고 있습니다. 이 글이 이렇게 주저리주저리 된 것도 지금 이 글을 쓰는 중에 읽기/쓰기 검사를 하고 있기 때문입니다. 아마 밤이 새야 끝날 듯 하네요.ㅎㅎ


파일시스템 생성 (mkfs)

파일 시스템은 각 파티션에 파일들이 저장될 수 있도록 파일을 관리하는 일종의 테이블을 생성하는 작업으로, 흔히 말하는 '포맷'과 같은 작업입니다.

mkfs를 실행할 때 -t 옵션 뒤에 파일시스템의 종류를 지정하도록 합니다. 예를 들어, ext4 파일시스템을 생성하기 위해서는 다음과 같이 입력하면 됩니다.

mkfs -t ext4 /dev/sdXN

위에서 생성한 파티션마다 위 명령을 반복 실행해서 모든 파티션에 파일시스템을 생성하도록 합니다.


파티션 레이블 정의 (e2label)

디스크에 레이블을 입력해놓으면 관리상 여러모로 편리합니다.

특히, 같은 용량의 디스크가 여러개 있을 경우 레이블을 입력해 놓아야 의도치 않은 불상사 (엉뚱한 디스크를 포맷한다거나..)를 막을 수 있습니다.

e2label 명령은 ext2, ext3, ext4 파일시스템에 대해 파티션 레이블을 정의하는 명령입니다.


현재 레이블 확인

sudo e2label /dev/sdXN


새로운 레이블 입력

sudo e2label /dev/sdXN {{새로운 레이블}}


TAG •