Introduction
리눅스 서버를 운영하다 보면 아주 가끔이지만 Boot 영역의 Mount Point인 "/boot" 디렉토리의 내용을 실수로 삭제하거나 일부 손상이 되어 정상적으로 부팅이 되지 않는 경우가 종종 있습니다.
이럴 경우는 iso에 있는 Boot 영역을 복사해줘서 살립니다.
운영중인 서버의 Boot 영역을 tar로 묶어서 전송해도 상관은 없지만 권장하는 방법은 아닙니다.
이 역시 문제점은 존재합니다. 기존에 운영중인 커널 이미지가 순정이 아닌 개인적인 설정이 들어간 이미지인 경우 운영자가 해당 정보에 대한 History를 모르면 그대로 원복 시키는 것은 힘듭니다.
Boot 디렉토리 복구 방법 - LAB
이 서버는 정상적으로 작동하고 있는 서버입니다.
[root@lilo boot]# pwd ; ls -l /boot total 112092 -rw-r--r--. 1 root root 153591 Oct 20 2020 config-3.10.0-1160.el7.x86_64 drwxr-xr-x. 2 root root 27 Jul 9 00:50 grub drwxr-xr-x. 5 root root 79 Jul 9 01:06 grub2 -rw-------. 1 root root 62126712 Jul 9 00:41 initramfs-0-rescue-a11b8925b852814da6a981780cc7e428.img -rw-------. 1 root root 21475586 Jul 9 00:45 initramfs-3.10.0-1160.el7.x86_64.img -rw-------. 1 root root 13535124 Jul 9 01:12 initramfs-3.10.0-1160.el7.x86_64kdump.img -rw-r--r--. 1 root root 320648 Oct 20 2020 symvers-3.10.0-1160.el7.x86_64.gz -rw-------. 1 root root 3616707 Oct 20 2020 System.map-3.10.0-1160.el7.x86_64 -rwxr-xr-x. 1 root root 6769256 Jul 9 00:41 vmlinuz-0-rescue-a11b8925b852814da6a981780cc7e428 -rwxr-xr-x. 1 root root 6769256 Oct 20 2020 vmlinuz-3.10.0-1160.el7.x86_64 |
위의 상황을 재현하기 위해 "/boot" 디렉토리의 내용을 삭제하고 서버를 재기동합니다.
[root@lilo boot]# rm -rf /boot/* ; ls -l ; reboot total 0 Connection to 192.168.56.100 closed by remote host. Connection to 192.168.56.100 closed. |
서버를 재기동하면 아래와 같은 화면이 등장합니다. Grub 부트로더에 대한 파일이 없으니 해당 에러가 뜹니다.
이제 서버에 미디어(ISO)를 넣어준 후 재기동을 해서 Rescue Mode로 진입합니다.
재기동 후 "Trouble Shooting"이라는 탭으로 진입후 "Rescue a CentOS system"에서 Enter를 누릅니다.
Rescue Mode는 복구 모드입니다.
Rescue에 진입되었고 아래의 멘트가 나오면 Shell에서 계속 작업을 할 것이기 때문에 "1"을 입력 후 Enter를 누릅니다.
현재 디렉토리는 "ISO"의 위치이므로 현재 "/" 위치가 아닌 이 서버의 "/"를 "/" 영역으로 사용하기 위해 "chroot"를 사용합니다.
bash shell로 진입이 완료되면 root 유저로 전환합니다.
sh-4.2# chroot /mnt/sysimage
bash-4.2# su -
사용중인 서버가 "Local Yum Repository"가 잡혀있을 경우에는 yum 명령을 이용해 더 쉽게 작업할 수 있습니다.
이 글에서는 2가지의 방법 모두 다 소개합니다.
먼저, yum을 이용한 Kernel 재설치입니다.
[root@localhost ~]# yum reinstall kernel
다음은, ISO 파일에 있는 Package 디렉토리안의 RPM 파일을 이용한 재설치입니다.
먼저, ISO를 임시 공간에 Mount 시킨후 Packages 디렉토리로 이동합니다.
[root@localhost ~]# mount /dev/sr0 /mnt (ISO 마운트)
[root@localhost ~]# cd /mnt/Pacakages
이제 Package를 설치합니다.
이미 Kernel 관련 RPM이 설치되어 있던 상황이므로 "--force" 옵션을 입력해서 강제로 설치합니다.
[root@localhost ~]# rpm -ivh --force kernel-3.10.0-957.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh --force grub2-2.02-0.76.el7.centos.x86_64.rpm
[root@localhost ~]# rpm -ivh --force centos-logos-70.0.6-3.el7.centos.noarch.rpm
이제 Package를 쓸 일이 없으므로 Mount를 해제합니다.
[root@localhost ~]# umount /mnt
이제 "grub"을 설치해야 되는데 "/boot" 영역이 어디로 잡혀있는지 확인하기 위해 아래의 명령을 입력합니다.
[root@localhost ~]# df
"/dev/sda"에 있는 것을 확인할 수 있습니다.
grub을 설치합니다.
[root@localhost ~]# grub2-install /dev/sda
에러 없이 설치가 잘 되었습니다. 꽤 재밌는 부분을 볼 수가 있습니다. "Installing for i386-pc platform" 로그입니다.
Boot 영역을 날린후 재기동 했을 때 본 에러 문구에서 찾을 수 없는 것을 설치하고 있다는 로그입니다.
또 확인해 볼 수 있는 것은 "grub.cfg"라는 설정 파일이 없다는 것입니다. 이 설정 파일이 없으면 당연히 재부팅해도 먹통이 되겠죠?
"grub.cfg"를 생성합니다.
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
커널관련된 이미지를 찾아서 내용을 알아서 잘 작성했다는 로그입니다. 이 이미지가 없으면 작성도 실패하겠죠?
이제 재부팅합니다.
[root@localhost ~]# exit
sh-4.2# exit
bash-4.2# exit
만약 "Reached target Shutdown"에서 행이 걸린다면 Virtual Box는 VM 자체를 재기동하고 BareMetal은 서버 자체를 재기동하는 방향을 가집니다.
이 글은 Trouble Shooting이지 절대로 서버에 이런 실수를 하지 않기를 바랍니다.
'Linux > Linux' 카테고리의 다른 글
Linux) 사용중인 VG의 LV 삭제 (0) | 2021.09.10 |
---|---|
Linux) TCP/UDP Port의 3가지 종류 (보안) (0) | 2021.08.14 |
Linux) 심볼릭 링크와 하드 링크 (0) | 2021.05.15 |
Linux) Sosreport를 이용해 시스템 정보를 전달하기 (0) | 2021.05.10 |
Linux) 빠르게 Log Message 확인하기 (0) | 2021.05.09 |