이 포스트에서는 CentOS 에서 디스크 파티션 추가 및 디스크 마운트 성공 후 잘못된 조작으로 발생한 오류를 해결한 과정에 대해 정리해보려 한다.
Linux
환경이 익숙하지 않다면 디스크 마운트
라는 과정에 대해서 생소할 수 있다.
디스크 마운트란 디스크와 같은 물리적인 저장장치를 특정 디렉터리에 연결해주는 과정이다.
이 과정을 거쳐야만 OS에서 물리적으로 연결된 저장장치를 인식할 수 있다.
반은 맞고 반은 틀린 말이다.
기본적으로 Windows
환경에서는 아래 이미지처럼 디스크 관리를 통해 드라이브 문자를 할당시켜서 마운트
시킬 수 있다.
그렇기 때문에 사용자가 굳이 마운트 명령어를 사용하거나 직접 저장장치와 디렉터리를 연결하는 과정이 필요하지 않고 간단한 설정을 통해 C:
, D:
와 같이 하드디스크의 작업공간을 분할시켜주기만 하면 바로 사용이 가능하다.
Linux
환경에서는 기본적으로 저장장치가 연결된 상태여도 사용자가 마운트
를 해주지 않으면 사용할 수가 없다.
그래서 mount
명령어를 통해 해당 파티션을 특정 디렉터리에 연결
하는 과정이 필요하다.
# 현재 디스크 표시
[root@localhost /]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004f5a0
Device Boot Start End Blocks Id System
/dev/sda1 * 1 39 307200 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 39 2350 18566144 83 Linux
/dev/sda3 2350 2611 2097152 82 Linux swap / Solaris
# /dev/sdb 가 앞으로 파티션을 추가하는 작업을 진행 할 디스크이다.
Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
# /dev/sdb 디스크에 파티션 추가
[root@localhost /]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2c2fd43d.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
# m 을 입력하여 명령어 확인이 가능하다.
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
# n 을 입력하여 새로운 파티션을 추가한다.
Command (m for help): n
Command action
e extended
p primary partition (1-4)
# p 를 입력하여 primary partition 선택한다.
p
# 파티션 번호 입력 (1-4), /dev/sdb1 과 같이 입력한 파티션 번호가 뒤에 붙는다.
Partition number (1-4): 1
# Frist, Last cylinder 값은 default로 선택했다.
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):
Using default value 130
# 마지막으로 w 를 입력하여 저장한다.
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# /dev/sdb1 을 ex4 파일 시스템으로 포맷
[root@localhost /]# mkfs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65280 inodes, 261048 blocks
13052 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# 마운트 포인트(디렉터리) 생성
[root@localhost /]# mkdir /data
# 추가된 파티션을 마운트 포인트에 마운트
[root@localhost /]# mount /dev/sdb1 /data
# 마운트 결과 확인
[root@localhost /]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 18143556 9953828 7261424 58% /
tmpfs 957112 224 956888 1% /dev/shm
/dev/sda1 289293 39609 234324 15% /boot
/dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final
/dev/sdb1 1011384 1284 957892 1% /data
위 과정을 통해 마운트가 가능하지만, 서버 재부팅을 하게 되면 마운트한 내용이 전부 사라지게 된다.
이를 방지하기 위해 아래 내용을 추가로 작업해줘야 한다.
먼저 blkid
명령어로 추가된 파티션들의 UUID
를 확인한다.
그 후 /etc/fstab
파일을 열어서 아래 이미지와 같이 위에서 봤던 UUID
를 추가해준다.
이 과정까지 끝나면 서버를 재부팅 해도 새로 추가한 파티션이 마운트 된 상태로 유지된다.
위 과정까지 진행하는 동안 오류가 발생할만한 부분은 크게 없었을 것이다.
그런데 파티션을 추가했던 저장장치를 삭제하고 재부팅을 했더니 서버가 정상적으로 부팅되지 않는 문제가 발생했다.
화면상에 아래와 같은 메시지가 표시되면서 할 수 있는 거라곤 강제 종료밖에 없었다.
# 부팅 시 오류 메시지
Setting clock --- ok
starting udev --- ok
setting hostname --- ok
checking filesystem --- no such file or directory while trying to open /dev/sdb1 'FAILED'
*** An error occured during the file system check.
*** Dropping you to a shell; the system will reboot
*** when you leave the shell.
*** warning -- SELinux is active
*** disabling security enforcement for system recovery.
*** run 'setenforce 1' to reenable.
Give root password for maintenance
(or type Control-D to continue):
왜 갑자기 이런 오류가 발생하나 생각해보니 서버 재부팅 후에도 마운트 설정을 유지하기 위해 수정했던 /etc/fstab
파일을 원래대로 돌려놓지 않은 상태로 서버 종료 후 저장장치를 제거해버린 게 문제가 된 듯했다.
당연히 마운트 관련 설정을 해놓고 해당 파티션을 물리적으로 제거해버렸으니 OS가 파티션을 찾으려 해도 찾지 못하고 부팅이 되지 않는 게 당연한 일이었다...=
당장 문제를 해결해야 하니 바로 해결방법을 설명하도록 하겠다.
위 오류 발생 시 마지막 문장을 보면 root password를 입력하라는 부분이 있다.
시키는 대로 root 패스워드를 입력하면 일단은 root 계정으로 터미널에 접속이 된다.
이대로 /etc/fstab
을 열고 수정해주면 될 것 같지만 역시나 운영체제는 기대를 저버리지 않는다.
위와 같은 오류가 발생해서 root password를 입력하고 들어오면 파일을 열어도 readonly
로 열리게 된다.
파일 수정이 되지 않으니 설정을 원래 상태로 돌릴 수가 없는데 이때 아래 명령어로 쉽게 해결이 가능하다.
mount -o remount,rw /
위 명령어로 읽기, 쓰기모드
로 변경 후 다시 /etc/fstab
을 열면 수정이 가능하다.
그 후에 새로 추가했던 파티션을 삭제하고 재부팅 하면 정상적으로 부팅되는 걸 확인할 수 있다.
오늘 알아본 오류는 새로운 저장장치를 추가하고 파티션을 마운트 한 후 설정을 되돌리지 않은 채로 저장장치를 제거했을 때 발생하는 오류였다.
발생하기까지의 조건이 일반적이진 않기 때문에 자주 볼 수 있는 오류는 아니다.
위 상황이 발생했을 때는 업무 관련 사항 때문에 새로운 파티션이 40개 이상 추가된 환경이 필요했다.
이를 재현하기 위해 VM에서 CentOS 서버를 띄운 후 진행했는데 저장장치의 추가/삭제가 쉬운 VM 환경이기 때문에 이 오류를 만날 확률이 더 높았던 거 같다.
테스트용으로 새로 띄운 서버에서 발생한 문제라 다행이지 기존에 사용 중인 서버에서 이런 실수를 했으면 해결될 때까지 땀을 뻘뻘 흘리며 고치느라 애를 먹었을 것이다.
업무 중에는 좀 더 신중히 생각하고 행동해야겠다고 다시 한번 느꼈다.
아래 방법은 위에 문제까지 해결하고 나니 리눅스 에이전트 개발팀 책임님이 와서 알려주신 방법이다.
# df -k 에는 표시되지않고 mount 에만 표시된다.
mount --bind /tmp/01 /testdir/01
위에서 봤던 복잡한 과정없이 그냥 디렉터리만 연결시켜서 마운트가 가능했다.
물론 재부팅하면 사라지지만 생각해보면 테스트용으로 디렉터리 40개를 다 마운트시키고 굳이 재부팅 후에도 그걸 계속 유지하고 있을 필요는 없었다...=
간단한 테스트를 할 때는 이 방법이 최고인 듯 하다.