본문 바로가기
정보보안/이론

[KITRI] Day9. 리눅스 응급 복구 기초 및 하드 디스크 관리

by 민-Zero 2020. 5. 6.

응급 복구

시스템이 부팅이 안 될때 해야 하는 작업이 응급 복구이다. 그중 root 사용자의 비밀번호를 잊어버렸을 경우 로그인 하지 못하는 경우에 해결하는 방법을 정리하자. 그러기 위해서 우선 init의 각 번호별 동작인 런 레벨(Run Level) 을 알아야 한다.

 

cat /etc/inittab 으로 init의 0~6번의 7가지 동작을 확인할 수 있다. 
0 - halt (시스템 종료)
1 - Single user mode (부팅 하자마자 root라는 계정으로 인증도없이 접근할 수 있는 관리모드이다. 단, 네트워크 기능을 막아놔서 원격접속이 불가하므로 물리적으로 장비에 직접 접근해야함)
2 - Multiuser, without NFS (NFS를 지원하지 않는 Multiuser 모드, 원격접속은 안된다.)
3 - Full multiuser mode (기본적으로 서버가 가장 많이 동작하는 모드, 네트워크 기능도 열려있기 때문에 원격접속 가능)
4 - unused (예약)
5 - X11 (Full moultiuser 에 X윈도우 까지 추가된것)
6 - reboot (재부팅)

이제 비밀번호를 잊어버린 상황이기 때문에 자동적으로 root로 접근되는 init 1인 관리모드로 들어가 비밀번호를 새롭게 덮어 씌워 비밀번호를 변경하는 형식으로 문제를 해결 할 것 이다.

 

우선 비밀번호를 잊어버렸다고 가정하고 리눅스를 새롭게 부팅한뒤 GRUB 메뉴로 접근한다.

 그럼 위와같은 화면을 볼 수 있는데 e버튼을 통해 부팅전에 수행되는 커맨드를 수정하도록 한다.

 

그럼 2번째 부분을 수정하도록 한다.

linux16 /boot/vmlinuz~~~ rhgb quiet 1
linux16 /boot/vmlinuz~~~ rhgb single  
둘중 하나로 변경하여 새롭게 부팅하여 init 1 으로 동작하도록 변경하는 것이다.  

위처럼 변경한뒤 새롭게 부팅하면 single user mode로 리눅스에 접속할 수 있는것을 확인할 수 있고 whoami 명령어로 확인하면 root로 별다른 인증없이 접속 한것을 확인할 수 있다.

 

그럼 일반적으로 로그인했을때 처럼 passwd 명령어를 통해 비밀번호를 재설정 할 수 있다. 이때 만약 passwd로 비밀번호가 변경되지 않을 수 있다.

이유는 mount 명령어로 확인하면 마운트가 rw가 아닌 ro(Read only)로 되어있기 때문에 passwd를 통해 새롭게 비밀번호를 덮어 씌우는 과정에서 쓰기가 동작하지 않기 때문이다.

그럼 / 디렉토리를 다시 rw로 마운트 시켜서 쓰기를 활성화 시킨뒤에 passwd를 수행하면 정상적으로 비밀번호를 변경할 수 있다.


init1 모드로 들어갔을때 sh-3.2#으로 나오는 프롬프트 모양을 변경할 수 있다.
PS1="[\u@\h \w]\$ " 프롬프트 모양 변경(\u는 현재 사용자 명 \h는 호스트명의 제일 앞)
\H를 사용할경우 호스트의 전체
\w 현재 위치를 간단하게 보여준다.
\W 절대 경로로 전부 보여준다.
\$ 루트라면 # 일반 계정이라면 $로 보인다.
"" 는 이스케이프 문자 처리를 하기 때문에 \\$로 해야 적용된다. 또는 ''로 감싸야 한다.


하드 디스크 관리

단순볼륨 : 추가된 HDD를 단일 파티션으로 만들어서 별도로 사용한다.
RAID : 2개이상의 HDD를 연결해서 1개의 볼륨으로 사용하는 방식, RAID는 0, 1, 2, 3, 4, 5, 6의 7가지 기본 레벨이 존재한다. 단 해당 방식은 전제 조건이 까다롭다. 동일 용량의 하드가 필요하기 때문에 주로 동일 회사, 동일 용량, 동일 버전의 하드를 사용해 구성한다.
LVM : 2개이상의 HDD를 연결해서 여러개의 볼륨으로 사용하는 방식


HDD 사용하기 위한 (작업)순서

Linux 환경
1. HDD를 메인보드에 연결한다.
2. 파티션을 생성한다.   (fdisk)
3. 파일시스템을 생성한다.   (mkfs)
4. 마운트 한다.
Linux FileSystem : ext1, ext2, ext3, ext4, xfs

Windows 환경
1. HDD를 메인보드에 연결한다.
2. 파티션을 생성한다.   (diskmgmt.msc, diskpart)
3. 포맷한다.            (format)
4. 드라이브 문자를 할당한다.

각 운영체제는 위의 과정을 거쳐야 하드디스크를 사용할 준비가 완료된다. 그럼 하드디스크를 사용하기 위한 과정을 수행해 보자.

 

① 하드디스크 연결

가상머신에 HDD를 추가하여 메인보드에 하드를 새롭게 추가했다고 가정하자. 그럼 SCSI 하드를 사용하기 위해 메인보드에 연결할 경우 부여받는 sd라는 이름의 하드를 찾아 보면 아래와 같은 정보를 확인할 수 있다.


brw-r----- 1 root disk 8,  0  5월  6 10:28 /dev/sda
brw-r----- 1 root disk 8, 16  5월  6 10:28 /dev/sdb
8 : 메이저넘버, SCSI 장치는 8번을 부여 받는다.
0 : 마이너넘버, 파티션 순서를 뜻한다. 따라서 sdb가 16이 시작이므로 sda는 0~15 까지 총 16개의 파티션을 나눌수 있다.

 

②파티션 생성

HDD를 연결했으므로 다음에 수행해야 할 일은 해당 디스크의 파티션을 생성하는 것이다. 파티션을 나누는 이유는 관리의 편리함도 있지만 시스템 안정성 확보와 보안을 위해서 꼭 필요한 부분이기도 합니다. 파티션을 나누지 않고 사용할 경우 용량이 꽉 찼을경우 새로운 프로세스 실행을 할 수 없거나 기존 프로세스가 중단되는 등의 문제가 발생하기 때문이다.

 

우선 간단하게 sdb를 1개의 주 파티션으로만 생성시켜보자.

fdisk 디스크명(위의 예시에서는 /dev/sdb) 명령어를 통해 파티션을 나누는 작업을 수행할 수 있다. n 커맨드를 통해 새로운 파티션을 생성할 수 있고 e, p로 extended, primary 파티션을 선택해 나눌수 있다. 예제에서는 단일 파티션으로 사용할 것이므로 모든 부분을 주 파티션으로 나누자.

 

생성한 파티션이 제대로 생성 되었는지 확인하려면 p 커맨드를 사용하면 확인할 수 있다. fdisk 수행중이 아니라면 fdisk -l 디스크명 을 사용하면 동일한 결과를 얻을 수 있다.

 

파티션 설정이 완료되면 자동저장이 아니므로 저장커맨드를 입력하고 나와야 파티션 설정이 저장이 된다. vi편집기와 같은 저장커맨드를 사용하며 fdisk -l 명령어로 다시 확인할 수 있다.


fdisk -l 디스크명 : 해당 하드의 파티션 확인
fdisk 디스크명(/dev/sdb) : 해당 디스크에 파티션 작업 수행
m or help로 옵션 확인
n 생성 -> primary 는 4개 까지만들수 있고 extended는 4개보다 많이 필요할경우 사용한다
파티션을 만든뒤 q! 로 나오게 되면 저장하지 않기 때문에 나눈 파티션이 설정되지 않는다.
따라서 생성한 파티션을 저장하려면 wq로 나오면 된다.

 

③파티션 포맷(파일 시스템 생성)

파티션을 나누었다면 해당 하드디스크를 사용할 준비가 어느 정도되었다. 그럼 이번에는 해당 하드디스크에서 어떤 파일 시스템을 사용할것인가를 정해주는 작업을 수행한다. 

파일 시스템이란 저장장치 내에서 데이터를 읽고 쓰기 위해 미리 정해진 약속이며 파일 저장 및 검색을 용이하도록 유지/관리하는 시스템이다. 따라서 반드시 수행해야 하며 파티션을 나눈 작업은 해당 부분에서 어떤 약속을 사용할지 구분하기 위한 사전 작업이다. 또한 ext3 이후 부터는 저널링 시스템으로 결함 발생시 시스템을 복구하는 기능또한 갖추었다. (Journaling File System - 파일 시스템의 변화를 기록해 두었다가 시스템 결함으로 문제가 발생할 경우 파일 시스템 복구)

 

어떤 장치가 어떤 파일 포맷으로 확인하기 위해서 blkid 라는 명령어를 사용하면 확인할 수 있다. 아직 새롭게 생성한 sdb1이라는 파티션의 파일 시스템을 생성하지 않았으므로 확인되지 않는다.

 

mkfs (make file system) 이라는 명령어를 통해 파일 시스템을 생성할 수 있다.

리눅스의 대표적인 파일 시스템으로는 ext2, ext3, ext4, swap, xfs, nfs 등이 있다. 이중 사용중인 리눅스가 지원하는 파일 시스템중 사용하고자 하는 것으로 생성하면 된다. 

 

blkid : 어떤 파일 시스템이 포맷되어있는지 확인할 수 있다.
mkfs -t ext3 /dev/sdb1

mkfs.ext3 /dev/sdb1       ->ext3 파일시스템으로 sdb1을 파티션 포맷 수행, 두 명령어 결과는 동일

 

④마운트

마운트란 쉽게 말해 물리적인 장치를 특정 위치의 디렉토리에 연결시켜주는 것을 말한다. 즉, 해당 하드에 파일을 저장하기 위해 디렉토리라는 하드에 접근할 수 있게 해주는 문을 생성하는 작업이다. 윈도우에서 usb나 ssd같은 하드 디스크를 새로 장착하게 되면 드라이브가 생성되며 해당 드라이브에 파일을 저장하는데 윈도우에서는 마운트라는 작업을 자동으로 수행하여 바로 저장할 수 있게 해주지만 리눅스에서는 해당 작업을 수동으로 해주어야 한다.

 

sdb라는 HDD에 접근하기 위해 mydata라는 새로운 디렉토리를 하나 만들고 해당 디렉토리와 HDD를 연결시킨다. 그럼 mydata라는 디렉토리에 데이터를 저장하면 sdb라는 디스크에 저장되게 되는것이다.

 
mount 디스크명 디렉토리명 : 간단하게 해당 디스크를 해당 디렉토리에 마운트 하는 명령어

 

이때 mydata 디렉토리에 어떤 파일이 있을때 마운트 하게되면 기존의 파일이 보이지 안게 된다. 해당 파일을 지워지는 것이 아니라 마운트하면서 sdb1에 덮어씌워져 보이지 않게 된다. umount를 수행하면 기존 파일을 다시 볼 수 있다.
마운트는 해당 하드디스크에 들어갈수 있는 디렉토리라는 문을 생성하는 과정이기 때문에 마운트 하기전 sda 에 저장된 /mydata 안의 파일이 /sdb로 마운트함에 따라 문이 다른곳에 생성된것이라 보이지 않는것이지 삭제된것이 아니다.

 

해당 명령을 통해 파일 시스템을 생성한 파티션의 크기와 사용량 마운트 위치등을 확인할 수 있다.

df -h : 파일 시스템 확인

 

mount 명령어 원본

mount [옵션] [장치명] [마운트포인트] 

마운트의 주요 옵션은 3가지 이다.

옵션 내용
-a /etc/fstab에 작성된 파일 시스템을 마운트할 때 쓰이는 옵션
-t 파일시스템 파일 시스템(ext2, ext3, ext4, xfs, fat, ntfs, iso9660 등)의 유형을 직접 지정
-o 항목 마운트 추가 설정 적용 옵션이며 여러 항목을 적용할때는 ,를 사용해 구분한다.

-o 추가 설정 옵션

옵션 내용
ro 읽기 전용으로 마운트한다.
rw 읽기 쓰기 모드로 마운트 한다 (기본값)
remount 해당 파티션을 다시 마운트한다. 주로 파티션 정보가 바뀌었을때 수행한다
loop loop 디바이스로 마운트 할때 사용한다. 주로 iso 이미지를 마운트해서 사용할 떄 사용
noatime 파일을 읽어도 access time이 변경되는데 해당 옵션을 통해 직접적인 변경 외에는 access time의 변경이 되지 않도록 한다. 해당 옵션을 사용하면 시스템의 작업을 줄여 성능 향상을 일으킬 수 있다.

이렇게 마운트한 장치들은 재부팅시 마운트 정보가 사라지기 때문에 /etc/fstab 이라는 설정 파일에 마운트 정보를 저장해야 한다.

/etc/fstab : 자동 마운트 설정파일(부팅시 자동으로 마운트할 장치들을 등록)
- 장치명 마운트포인트(절대경로) 파일시스템 옵션 덤프순서

mount -o defaults -t ext3 /dev/sdb1 /mydata라는 명령어와 동일한 동작을 수행하도록 fstab에 입력한다면 
dev/sdb1  /mydata ext3 deafults 1 2 이 된다.

 

여기서 1 2가 뜻하는 덤프순서를 정리하면 덤프는 부팅시 fsck(filesystem check, 스캔 디스크) 후 마운트를 진행하는 옵션이다.
1은 ext3 이상에만 사용하길 권장한다. 이유는 스캔 디스크를 수행하기 때문에 저널링이 지원되지 않으면 너무 오래걸린다. 
2는 덤프할때 순서가 있어야 하기때문에 해당 순서를 기록한것 1은 루트 2는 그 이외의 모든것에 부여한다.

이제 부팅이 될때 fstab에 있는 마운트정보를 통해 부팅이 되는데 fstab에 있는 마운트된 디바이스를 강제로 제거한다면 부팅이 안된다.

따라서 복구를 위해 repair 모드로 들어가게 된다.

이때 복구를 위해 마운트 되었다고 나오지만 강제로 제거된 하드를 정보로 가지고있어 에러를 발생시키는 /etc/fstab에 서 sdb1 을 지우려고 하면 read only라고 지워지지 않는다. 따라서 재마운트를 통해 ro로 되어있는 옵션을 쓰기도 가능한 rw로 설정을 변경해야 한다.
mount -o remount,rw / 를 통해 fstab이 저장되어 있는 루트 디렉토리의 마운트정보를 rw로 변경한다. 

그럼 sdb1의 정보를 지우면 제거를 할 수 있고 init 6 를 통해 재부팅을 하면 정상적으로 사용할 수 있다.


레이블명을 통한 마운트

앞서 fstab에 마운트 정보를 등록할때 디바이스명 자체를 사용해서 마운트를 했는데 디바이스명을 사용한 마운트 말고 레이블명을 통한 방법도 있다. 해당 방법의 등장이유는 기존의 장치가 수리나 모종의 이유로 잠시 제거되었다가 다시 연결되었을때 순서가 변경됨에 따라 sdb라는 명칭이 sdd로 변경된다면 마운트 정보와 틀려지게 되기 때문이다. 따라서 이를 극복하기 위해 해당 디바이스의 주석같은 역할을 하는 레이블을 통해 마운트 할 수 있도록 도와준다.


레이블명 확인은 blkid 라는 명령어로 확인 가능하다. 


e2label 장치명 "레이블명" : 해당 디바이스의 레이블명 설정 명령어


vi /etc/fstab에 레이블 명을 기준으로 마운트 가능하며 아래와 같은 형식으로 작성한다.
LABEL=레이블명 마운트포인트 파일시스템 옵션 덤프순서

 

디바이스 명이 LABEL이라는 변수를 사용해 레이블 명을 이용하는 것으로 변경된것 뿐 달라진 점은 없다.
하지만 레이블 명을 통한 방법도 지금은 사용하지 않는데 이유는 레이블 명이 중복 가능하기 때문이다.

디바이스명, 레이블명 을 통한 마운트의 문제점을 해결하기 위한 방법이 UUID이다.

UUID도 blkid로 확인가능

UUID또한 기존의 fstab작성 방법과 동일하며 디바이스명이 UUID로 변경되는것 뿐이다.

 

fstab에 작성할때 디바이스를 적는 방법은 장치명, 레이블명, UUID 총 3개 이며 정리하면 아래와 같다.

장치명 : 장치의 연결된 순서가 바뀌면 장치명도 바뀌는 문제점이 있다.
레이블명 : 레이블명은 중복되는 문제점이 있다.
UUID명 : 네트워크상에 유일한 이름으로 부여되기 때문에 어디서 어느 컴퓨터와 연결되어도 같은 이읆은 사용할 수 있다.

댓글