이 포스트에서는 CentOS 에서 디스크 파티션 추가 및 디스크 마운트 성공 후 잘못된 조작으로 발생한 오류를 해결한 과정에 대해 정리해보려 한다.
디스크 마운트(Disk Mount)란?
Linux 환경이 익숙하지 않다면 디스크 마운트라는 과정에 대해서 생소할 수 있다.
디스크 마운트란 디스크와 같은 물리적인 저장장치를 특정 디렉터리에 연결해주는 과정이다.
이 과정을 거쳐야만 OS에서 물리적으로 연결된 저장장치를 인식할 수 있다.
Windows 환경에서
Windows 환경에서는 아래 이미지처럼 디스크 관리를 통해 드라이브 문자를 할당시켜서 마운트 시킬 수 있다.
그렇기 때문에 사용자가 굳이 마운트 명령어를 사용하거나 직접 저장장치와 디렉터리를 연결하는 과정이 필요하지 않고 간단한 설정을 통해 C:, D: 와 같이 하드디스크의 작업공간을 분할시켜주기만 하면 바로 사용이 가능하다.
Linux 환경에서
Linux 환경에서는 기본적으로 저장장치가 연결된 상태여도 사용자가 마운트를 해주지 않으면 사용할 수가 없다.
그래서 mount 명령어를 통해 해당 파티션을 특정 디렉터리에 연결하는 과정이 필요하다.
CentOS 환경에서 디스크 마운트 방법
# 현재 디스크 표시
[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를 추가해준다.
이 과정까지 끝나면 서버를 재부팅 해도 새로 추가한 파티션이 마운트 된 상태로 유지된다.
/etc/fstab 파일 수정 오류
위 과정까지 진행하는 동안 오류가 발생할만한 부분은 크게 없었을 것이다.
그런데 파티션을 추가했던 저장장치를 삭제하고 재부팅을 했더니 서버가 정상적으로 부팅되지 않는 문제가 발생했다.
화면상에 아래와 같은 메시지가 표시되면서 할 수 있는 거라곤 강제 종료밖에 없었다.
# 부팅 시 오류 메시지
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 환경이기 때문에 이 오류를 만날 확률이 더 높았던 것 같다.
테스트용으로 새로 띄운 서버에서 발생한 문제라 다행이지 기존에 사용 중인 서버에서 이런 실수를 했으면 해결될 때까지 땀을 뻘뻘 흘리며 고치느라 애를 먹었을 것이다.
업무 중에는 좀 더 신중히 생각하고 행동해야겠다고 다시 한번 느꼈다.
또 다른 디스크 마운트 방법
fdisk를 사용하여 파티션 추가하는 과정없이 디렉터리에 바로 마운트도 가능하다.
아래 방법은 위에 문제까지 해결하고 나니 리눅스 에이전트 개발팀 책임님이 와서 알려주신 방법이다.
# df -k 에는 표시되지않고 mount 에만 표시된다.
mount --bind /tmp/01 /testdir/01
위에서 봤던 복잡한 과정없이 그냥 디렉터리만 연결시켜서 마운트가 가능했다.
물론 재부팅하면 사라지지만 생각해보면 테스트용으로 디렉터리 40개를 다 마운트시키고 굳이 재부팅 후에도 그걸 계속 유지하고 있을 필요는 없었다...=
간단한 테스트를 할 때는 이 방법이 최고인 듯 하다.
댓글