}

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 시스템 해킹 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate using chrome ↓↓↓===***===>

2020년 8월 20일 목요일

grub이란(리눅스 응급복구)자세히

안녕하세요~ 마무입니다. 오늘은 리눅스에서 사용하는 부트로더 "GRUB이란"과 "root 비밀번호 변경", "./autorelabel", "exec /sbin/init", "리눅스 응급복구" 에 대해서 알아보겠습니다.

이 글을 다 읽으시면

grub2이란 부트로더, 리눅스 root비밀번호 변경

에 대해서 알게되고 하실 수 있게 됩니다!


*이 포스트를 이해하기 위한 선행 지식* 
프로세스 개념 : 프로세스란, 데몬과 서비스, 파일이름 끝에 d란, 웹서버와 브라우저 개념 살짝
부팅 과정 : 부팅 과정(ROM, 펌웨어, BIOS, POST, MBR, 부트로더, 부트스트랩)
**********************************************


--목차--

1. 리눅스의 부트로더 GRUB2

2. 응급복구(루트 비밀번호 되찾기)
i) 레드햇(centos)6.9이하 버전
ii) 레드햇(centos)7이상 버전
    a) SELinux 끄는 방법
    b) SELinux 끄지 않는 방법

---------

여기서 못 찾은 정보는
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
운영체제 독학 페이지: https://mamu2830.blogspot.com/p/blog-page_14.html
에서 찾아보세요!




1. 리눅스의 부트로더 GRUB2


자 지난번 포스트에서, 저희는 공통적인 PC의 부팅 순서에 대해서 알아봤습니다. 그리고 운영체제를 메모리에 올리는 "부팅"을 해주는 "부트로더"에 대해서도 알아봤고, 정말 중요한 소프트웨어이기 때문에, 각 운영체제마다 독자적인 부트로더를 갖고 있다고 했었죠.

저희는 리눅스를 독학하고 있기에, 이번 포스트에선 부트로더중 리눅스에서 쓰이는 부트로더 "GRUB" 또는 "GRUB2"에 대해서 알아볼 겁니다!

"GRUB(GRand Unified Bootloader)"는 이름 "대통합(Grand Unified)"이란 뜻처럼, 대부분의 운영체제에서 사용가능한 GNU프로젝트에서 만들어진 "부트로더" 입니다. (GNU프로젝트라는 것이 궁금하시다면 "유닉스/리눅스 역사와 라이센스" 포스트를 보고 오세요!)

이 "GRUB"이란 부트로더는 유닉스 BSD계열과 대부분의 리눅스 배포판에서 주로 사용하고 있으며, 심지어 저희가 사용하고 있는 윈도우에서도 사용이 가능합니다.

이 "GRUB2"라는 이름을 처음 듣는 사람은 '뭐야 그게.. 딱풀 이름 같은데..' 하며 낯선 느낌이 드시겠지만, 리눅스를 사용해본 적이 있는 사람들은 다 리눅스를 킬 때마다 항상 봤을 겁니다.

바로! 리눅스를 VM을 이용해 키면 처음에 뜨는




"검은색 화면"이 바로 "GRUB2"였던 겁니다!





우리는 이 검은색 화면(GRUB)에서 어떤 커널(운영체제)를 선택해 부팅(메모리에 올리는)할지 선택하죠.

위 사진을 보시면 맨 위는 "CentOS 3.10.0-1062.18.1.el7.x86_64", 가운데는 "3.10.0-1062.el7.x86_64" 커널로, 둘은 버젼만 다른 커널이지만 매번 저렇게 마음에 드는 커널을 골라 부팅할 수 있는 것처럼, "GURB" 부트로더는 같은 리눅스 배포판이라 해도 커널 버젼별로 부팅이 가능하다는 것과  부팅시에 커널 인자를 조정해 부팅할 수 있는 장점이 있습니다.

참고로 맨 밑에 있는 "0-rescue"는 OS커널의 코드 전체를 메모리에 올리는 게 아니라, 정말 딱 부팅에 필요한 최소한의 검증된 커널 코드로만 부팅을 하는 걸 의미합니다.

그래서 DVD, USB와 같은 용량이 적은 저장공간에서 부팅할 때 사용하거나, 이 "0-rescue"는 정말 검증받은 최소한의 프로그램들만 있기에 윈도우 안전모드처럼, 시스템에 문제가 생겼을 때 사용할 수 있습니다.

물론 "윈도우 안전모드""전체 윈도우 커널로 부팅"하는 거고, "rescue-mode""최소한의 커널 코드으로만 부팅"하는 것이기에 둘이 완전히 같다곤 할 순 없지만요 ㅎㅎ

'뭐...그래.. 그런데 이게 끝인가? 굳이 공부해야할 정도는 아닌 것 같은데?'
라고 생각이 드실겁니다.

후후.. GRUB에 대해서 공부할 기능은 이게 다가 아닙니다!! 다들 리눅스를 공부할 때 한번쯤 이런 생각을 하신 적이 있으실 겁니다 바로
'root 관리자의 패스워드를 까먹으면 어떡하지?' 라는 걱정을 말이죠.

다른 계정의 아이디나 패스워드야 "ROOT"로 로그인해서 바꾸거나 새로 만들면 그만이지만, "ROOT"의 패스워드를 잃어버리면 방법이 없으니까요~ 혹자는 "root"패스워드를 까먹어서, 리눅스를 다시 깐 사람도 분명 있을겁니다.

하지만 앞으론 그럴 필요가 없습니다! 바로 이 "GRUB""부팅시 커널 인자 조정을 할 수 있는 기능"을 이용해 "root패스워드" 없이도 root로 로그인 할 수 있는 방법이 있거든요!

이 방법을 루트 패스워드를 복구할 때와 같은 응급 상황에 사용한다 해서 "응급복구"라고 합니다.



2. 응급복구(루트 비밀번호 되찾기)



i) 레드햇(centos)6.9이하 버전 

6.9 버젼 이하의 레드햇(centos)는 root 비밀번호 변경이 너무나 쉽습니다. 
일단 6.9이하 레드햇(centos)를 키시면 제일 먼저




이런 화면이 뜨실텐데요, 키보드 아무 키나 누르시면




이런 화면이 나올겁니다. 여기서 "a"를 누르시면




이렇게 뜹니다. 여기서 맨 끝에



"1(단일 사용자 모드)"이나



"single(단일 사용자 모드)"를 쓴 뒤키보드 "enter"를 누르시면




이렇게 단일모드의 "root"로 로그인이 됩니다. 그리고 여기서 "passwd"명령어로 패스워드를 변경하고 재부팅하면 끝~

ii) 레드햇(centos)7이상 버전

아쉽게도 레드헷(centos) 7버전 이상부턴 6.9이하처럼 쉽게 패스워드를 바꿀 수가 없습니다. 그 이유에는 일단 크게 3가지가 있는데 첫 번째"SELinux"라는 보안프로그램이 패스워드 변경을 적용 못하게 막는 것과, 두 번째는 7이상 버전부턴 "a"키가 사라졌으며, 세 번째는 리눅스의 "/" 디렉토리가 "ro(read only)"로 마운트가 됐기 때문입니다.

그래서 7 이상 버전은 사실 위에서 말한 문제 3가지를 해결해야 패스워드를 변경할 수 있습니다.

일단 리눅스를 껐다가, 다시 킵니다. 당연히 응급복구는 "GRUB2"에서 해야하는 일이기 때문이죠!





자 익숙한 이 "GRUB2"의 커널 선택 창이 떴을 때, 제가 주황색으로 표시한 밑 부분에 "edit"하기 위해선 "e(edit)"를 눌러달라고 뜨죠? 그 말대로 키보드의 "e"키를 누릅니다.

그러면




이런 뭔가 복잡해 보이는 영어들이 쭈르륵 뜰텐데, 너무 걱정할 필요 없습니다. 여기서
키보드 "↓"를 눌러서 맨 밑으로 가시면





이렇게 "ro\""rhgb quiet LANG=ko)KR.UTF-8" 이렇게 쓰여 있는 부분이 보이실 겁니다.

다들 감이 오셨겠지만 "ro""read only"를 의미하며



앞에 있는 "root=/dev/mapper/centos-root"를 "read only"로 마운트 하라는 의미입니다.
여기서 "root=/dev/mapper/centos-root"란 저의 "마운트 포스트"와 "LVM의 모든 것 포스트"를 보셨던 분들이면 다들 아실 "LV(Logical Volume)"으로 만들어진, "/"가 마운트 된 /dev/sda2의 이름이죠.

그리고 "\"란 리눅스 터미널에서 긴 명령어를 쓰는데 오른쪽 끝에 도달했을 경우 뭔가 불편하잖아요? 그럴 때 다음 칸에 명령어를 계속 이어 쓰겠다란 기호입니다. 그러니 사실 위에서




이렇게 보라색으로 표시한 글들이 모두 "한 줄"의 글이라는 거죠.

계속해서 "rhgb quiet LANG=ko_KR.UTF-8""rhgb"란 "redhat graphical boot"를 의미하며 GUI환경(X윈도)으로 켜라 라는 뜻입니다.

"quiet"란 영어 뜻 그대로 중요한 부트 메세지를 보여주지 않고 조용히 켜라 라는 뜻입니다.

"LANG=ko_KR.UTF-8"이란 LANG(language, 언어) =(는) ko_KR(ko_KR이란 언어의).UTF-8(UTF-8형식으로) 란 뜻입니다.

설명이 길어졌는데 이제 여기서 우리는 2가지를 바꿀겁니다.
먼저 키보드 화살표를 눌러서 이동해




"ro"를 지운다음 "rw"를 써주시고, 그 다음 "rhgb quiet LANG=ko_KR.UTF-9"를 지운 다음 "init=/bin/sh"를 씁니다.

여기서 "init=/bin/sh"이란 아직은 안 배웠지만 리눅스가 처음에 켜지면 제일 먼저 실행되는 프로세스가 바로 init(systemd)이거든요? 이 init에게 "/bin/sh"이란 파일을 실행시키라는 의미입니다.(여기서 아시는 분들은 아시다시피 /bin/sh은 쉘입니다. 그래서 sh대신 bash를 써도 무방합니다.)





이렇게 말이죠. 그리고 "Ctrl""x"를 같이 눌러서 리눅스를 시작해주세요.




그럼 이렇게 단일모드(혼자서만 컴퓨터를 쓰는, 한마디로 PC)로 리눅스가 시작됩니다.
여기서




이렇게 "whoami" 명령어로 확인하니 "root"인걸 확인할 수 있죠.




또한 "mount" 명령어를 쳐서 맨 마지막을 보시면 "/"가 "rw"로 마운트 돼 있는 것을 확인 할 수 있습니다. 여기까지 끝냈으면 이제 패스워드를 바꿔주면 됩니다~~~~라 하면 좋겠지만 아까 시작할 때 말했던 "SELinux"문제 기억나시나요?

여기서 저희는 "SELinux"를 끈 다음 패스워드를 변경하던가, 아니면 "SELinux"에게 비밀번호 변경을 적용하게 만들어야 합니다.

사실 "SELinux"를 끄는 첫 번째 방법이 매우 쉽고 간단하지만, 공부용이나 개인용이 아니라면 "SELinux"를 끄는건 좋은 선택이 아니죠.

일단 "SELinux"를 끄는 방법부터 설명한 뒤에 "SELinux"를 끄지 않는 방법을 설명하겠습니다.

(참고로 SELinux 문제를 해결하지 않으면, 패스워드를 변경했음에도 root로 로그인할 때 변경된 패스워드 뿐만 아니라 기존의 패스워드로도 "root"에 로그인 못하는 불상사가 발생할 수 있습니다.)

 a) SELinux 끄는 방법





제일 먼저 "vim(vi) /etc/sysconfig/selinux"를 명령어를 쳐서 selinux 설정 파일에 들어갑니다.




그러면 이런 화면이 뜨실텐데




위에 써 있는 것처럼 "SELINUX=enforcing"의 "enforcing"대신 "disabled"을 적어줍니다.




이렇게 적은 뒤에 ":wq"로 나가줍니다.

그리고 나서 드디어




이렇게 패스워드를 바꾸고 재부팅을 하면 됩니다만! 이 상태에선 "reboot"이나 "halt -p"와 같은 명령어가 먹히지 않습니다.

고로




이렇게 눌러서 종료 및 재부팅을 해주시면 됩니다.


b) SELinux 끄지 않는 방법





이렇게 패스워드를 변경한 다음에




"touch /.autorelabel"이란 명령어로 ".autorelabel"이란 숨김 파일을 만들어줍니다.

원래 "SELinux"는 보안상 기존 파일들의 정보를 기억하고 있는데, 우리가 "passwd" 명령어를 통해 패스워드를 바꾸면 "/etc/shadow" 파일이 바뀌기에 "SELinux"자기가 기존에 기억하고 있던 "/etc/shadow" 파일 정보와 다르니까 보안상 적용을 안 시킵니다. 그래서 재부팅 하면 패스워드가 변경이 안 돼 있죠.

여기서 "/.autorelabel"이란, "자동으로 다시 이름 붙이기"란 뜻대로 이 파일을 만들고 부팅을 하면 "SELinux"가 이 파일을 보고 자기가 기억하고 있던 파일 정보들을 갱신합니다.

그래서 패스워드 변경이 적용이 됩니다.

하지만 여기서 한 가지 할 일이 더 남았으니 그것은 바로

"exec /sbin/init"이란 명령어를 입력하는 것입니다.

여기서 "exec"란 추후에 프로세스편에서 다루겠지만 "프로세스 자신 스스로를 다른 프로세스로 만들어 내는" 명령어 입니다.




"exec"는 위 그림에서 볼 수 있듯이 디스크에서 새로운 코드를 가져와 기존의 프로세스를 바꾸는 명령어라는 것이죠.

그리고 "/sbin/init"이란 위에서도 언급했었던 최초의 프로세스 "init"이 맞습니다.
"init"이란 녀석은 부팅 때 제일 먼저 켜지는 프로세스이고, 이 "init"이 나머지 부팅에 관련된 프로세스들을 전부 실행시켜줍니다.

그리고 그 "init""/sbin(system binary)" 디렉토리에 들어있는 것이고요.

우리는 아까 응급복구 모드를 할 때, "rhgb quiet"를 지우고 "init=/bin/sh"이라 썼었던 것 기억나시나요? 그래서 우린 다시 컴퓨터를 켰을 때 "init"이 바로 "/bin/sh"파일을 실행시켰고 그 덕에 우린 응급복구 모드로 들어올 수 있었던 것이죠.

그리고 우린 지금




이렇게 "sh"로 들어와 있습니다. 사실 이부분은 아직 프로세스에 대해 알려주지 않았기에 이해가 잘 안되실텐데... 일단 원래 아까 말했듯 최초의 프로세스란 "PID(Process ID)"가 1번이고 원래는 "init(7이상은 systemd)"가 1번이여야 합니다.




이렇게 말이죠.

그런데 응급복구에선 "sh"이 1번이였죠? 

그래서 우린 "exec /sbin/init"이란 명령어로 "sh""init"프로세스로 바꿀겁니다.
다시 말해서 현재 실행되고 있는 프로세스 PID 1번 "sh" "exec"명령어를 통해 "/sbin/init"으로 바꾼다는 겁니다.

그러면 우린 "sh"대신 "init"을 실행시킬 것이고, "init"을 실행시키기 위해선 다시 "부트로더(GRUB)"부터 시작해서 "커널(운영체제)"를 실행한 뒤 "init"을 실행 시켜야하기에 
즉, 재부팅이 될 겁니다.






이렇게 명령어를 치면




이런식으로 화면이 나오면서 조금 시간이 걸립니다.
그리고 시간이 지나면





이렇게 다시 GRUB의 커널 선택 창으로 돌아갑니다. 

여기서 우리가 비밀번호를 바꿨던 커널로 시작을 한 뒤, 바꾼 비밀번호로 "root"를 로그인 하면 끝!




다음 포스트에선 드디어 최초의 프로세스에 대해서 다뤄보겠습니다!
도움이 되셨다면 좋아요, 팔로우 클릭, 따뜻한 댓글을 남겨주시면 저에게 큰 힘이 돼 포스트의 퀄리티와 포스팅 속도를 올려줍니다!!

그럼 다음에 더 좋은 퀄리티로 찾아뵙겠습니다.

리눅스 독학 페이지로 가기

운영체제 독학 페이지로 가기






댓글 2개:

  1. 늘 잘 보고 있습니다. 근데 선생님 a) 셀 리눅스 끄는 방법에서 SELINUX가 야스LINUX로 오타났어요...

    답글삭제
    답글
    1. ㅋㅋㅋㅋㅋㅋㅋ 알려주셔서 감사합니다~

      삭제

#1 여러분들이 소중한 시간을 투자해 달아주시는 따뜻한 댓글들은 저에게 정말 큰 힘이 됩니다!

#2 저의 각 포스트들은 엄청난 노력과 시간 투자를 통해 만들어진 포스트들로, 무단 복제나 모방하는 것을 금지합니다.

#3 저의 포스트에도 틀린 정보가 있을 수도 있습니다. 그럴 경우 친절한 말투로 근거와 함께 댓글로 달아주시면 정말 감사하겠습니다!