부트 프로세스
1단계: 시스템 전원 ON
- 모든 운영체제를 부팅하기 위한 첫 단계
2단계: BIOS 프로그램의 실행
- POST : 부팅이 시작되면 컴퓨터는 가장 먼저 자체진단 기능을 통하여 컴퓨터 이상 유무를 검사한다.
- 컴퓨터에 전원이 들어오면 먼저 전류는 CPU 로 흘러 들어가게 되며 CPU 는 BIOS 프로그램을 불러들이게 된다.
- BIOS 프로그램은 CPU 를 시작으로 CMOS 를 검사하고, 메모리 테스트 후 용량을 확인한다.
- 그래픽 카드, 키보드, 마우스 등 각종 장치의 이상 유무를 검사하여 초기화한다.
3단계: 부트매체의 검색
- POST 과정에서 하드웨어 검사가 무사히 완료되면 검색된 부팅 매체 (HDD, ODD, USB, 네트워크 등) 중 CMOS 에 설정되어 있는 순서대로 부팅 시도한다.
- MBR(Master Boot Record) 에 존재하는 부트로더인 GRUB 를 읽어 들이게 되며, 부트로더가 메모리에 적재되고, 시스템의 제어권은 부트로더가 갖게 된다.
4단계: 부트로더의 실행
- 부트로더는 Kernal 을 메모리에 올려놓게 된다.(레스큐 모드로 실행할 지 일반 모드로 실행할 지 결정하는 화면)
- 부트로더는 Kernal 이미지를 불러들이고 시스템의 제어권을 넘겨온다.
5단계: 커널 부트 이미지 적재
- GRUB 의 부트 메뉴에서 Kernal 을 선택하게 되면, Kernal 이미지가 동작한다.
- Kernal 이미지는 압축되어 있기 때문에 PID 0번 인 swapper 프로세스를 호출한다.
- swapper 프로세스는 Kernal 이미지를 압축해제하고 Kernal 이 사용할 각 장치들을 (메모리, HDD, 시리얼 장치, 마우스 등 하드웨어) 초기화하고 자세한 정보를 콘솔에 출력한다.
6단계: 루트 파일시스템 마운트
- 하드웨어의 검색 후 커널은 루트 (/) 파일 시스템을 마운트한다.
- 마운트는 안전하게 점검될 수 있도록 읽기 전용(read-only) 로 마운트된다.(보통 읽기 전용을 사용하는 경우는 점검, 체크를 하기 위해서다)
- 이후에 읽기/쓰기 마운트가 이루어진다.
7단계: systemd 프로세스 실행
- 모든 프로세스의 모든 부모 역할을 하는 PID 1번인 systemd 프로세스를 실행한다.
- systemd 프로세스는 사용자가 시스템을 실제로 사용할 수 있도록 시스템 초기화를 진행한다.
- systemd 프로세스는 기본 시스템 초기화 스크립트인 local-fs.target 을 통해 파일 시스템을 점검한다.
- 이후 sysinit.target 을 시작으로 필요한 스크립트를 통해서 커널 모듈의 메모리 적재, 스왑 파티션 초기화, 네트워크 초기화, 서비스 프로세스 관리, 가상 콘솔 접속 관리, 실행 레벨 관리를 실행한다.
systemd 는 default.target 을 불러서 실행시킨다.
default.target 은 graphical.target 이나 mutil-user.target 둘 중 하나로 설정된다.
각각의 타겟들은 종속성에 의해 연계되서 실행되야 한다.
local-fs.target 이 실행되야 sysinit.target 이 실행될 수 있고 sysinit.target 이 실행되어야 basic.target 이 실행될 수 있고 basic.target 이 실행되어야 mutil-user.target 이 실행될 수 있고 mutil-user.target 이 실행되어야 graphical.target 이 실행될 수 있다.
타겟의 종류로는 아래와 같다.
- graphical.target ⇒ GUI 환경 구성
- mutil-user.target ⇒ CLI 환경 구성, 네트워크 환경 구성, 웹 서비스 환경 구성, rsyslog 서비스 구성
- basic.target ⇒ SELINUX(보안 서비스), microcode
- sysinit.target ⇒ 마운트 안정화
- local-fs.target ⇒ /etc/fsab 에 등록된 마운트 작업
추가적으로 rescue.target 과 emergency.target 이 있다.
- rescue.target ⇒ single mode root/ 로 비밀번호가 필요하고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기쓰기 모드이다. /etc/fstab 에서 마운트 옵션을 제대로 적지 않으면 rescue.target 모드로 부팅이 된다.
- emergency.target ⇒ single mode root/ 비밀번호가 필요 없고 네트워크를 사용하지 않는다. /(sysroot)에 대해서 읽기 전용 모드이다.
$ ls /etc/systemd/system/타겟명.target.wants/ 로 직접 타겟을 구성하고 있는 서비스들을 확인할 수 있다.
옛날에는 Run level 을 사용했으나 7버전으로 넘어오면서 타겟을 사용하게 됐다.
아래처럼 run level 을 확인할 수 있다.
default target 확인
현재 어떤 타겟이 디폴트 타겟인지 확인할 수 있다.
$ systemctl get-default
default target 설정
$ systemctl set-default multi-user.target 또는 graphical.target
타겟 전환
멀티 유저 타겟에서 그래피컬 타겟으로 전환하거나 그 반대로 전환하고 싶을 때는 systemctl isolate 명령어를 사용하여 타겟을 전환할 수 있다.
타겟 전환은 graphical.target 실행하고 나서 전환할 수 있다. 만약 multi-user.target 일 경우 graphical.target 으로 타겟 전환할 수 없다. 왜냐하면 타겟 전환은 타겟을 실행시키고 전환하는 것이 아닌 실행 중인 타겟으로 전환하기 때문이다.
$ systemctl isolate multi-user.target 또는 graphical.target
root 비번 변경
- 커널선택 화면에서 아무키 눌러서 카운트 다운을 해제한다. 원하는 커널에서 'e'눌러서 GRUB 진입
- linux16 라인 끝에 rd.break 입력 후 ctrl+x 를 눌러서 emergency 모드로 실행한다. 아까 봤던 emergency.target 으로 읽기 전용 모드이다.
- mount -o rw,remount /sysroot ⇒ /sysroot 를 읽고 쓰기 모드로 재마운트 한다.
mount 명령어를 입력해서 /sysroot 의 모드를 맨 마지막 줄에서 확인할 수 있다.
현재 sysroot 가 읽기 전용이다.
맨 마지막 줄에 /dev/sda2 on /sysroot type xfs (ro, ...) ro 즉, Read only 모드인 것을 알 수 있다.
mount -o rw,remount /sysroot 명령어를 입력해서 rw 로 모드를 변경했다.
맨 마지막 줄에 /dev/sda2 on /sysroot type xfs (rw, ...) rw 즉, Read write 모드인 것을 알 수 있다.
- chroot /sysroot
- passwd 명령어를 실행해서 root 비밀번호를 변경한다.
한글 세팅이 되어 있어서 문자가 깨져서 나왔다. 영어로 언어가 설정돼 있으면 깨지지 않고 제대로 나올 것이다.
- touch /.autorelabel ⇒ /sysroot 에 생긴 변화를 메모리 초기화 전에 본 시스템에 인식시키기 위한 증거 파일이다. 이 파일을 만들지 않을 경우 운좋으면 비밀번호가 안바뀌는 것이고 운 나쁘면 부팅이 아예 되질 않는다... 꼭 만들어줘야 한다.
- ctrl+d 를 두번 눌러주면 재부팅이 된다.
그러면 아무나 루트 비밀번호를 변경할 수 있다고 생각할 수 있는데 초기 상태이기 때문에 가능한 것이다.
부트로더 ID 및 PW 설정을 할 경우 일반 사용자들이 루트 비밀번호를 변경할 수 없게 할 수 있다.
부트로더
- 운영 체제의 부팅 이전에 먼저 실행되는 프로그램으로 커널이 올바르게 부팅되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영 체제를 부팅 시키기 위한 목적을 가지고 있다.
GRUB
- 파일 시스템과 커널 실행 포맷을 인식하여 하드디스크 상에서의 커널의 물리적인 위치를 기록하지 않고도 커널의 파일명과 커널이 위치하고 있는 파티의 위치만을 알고 있으면 시스템 부팅이 가능하다.
- $ cat /boot/grub2/grub.cfg
- $ cat /etc/default/grub
- $ grub2-editenv list ⇒ 현재 사용하는 커널 확인
부트로더 커널 이미지 카운트 다운 시간 설정
$ vi /etc/default/grub
GRUB_TIMEOUT=5 => 5를 다른 숫자로 :wq
부트로더 ID 및 PW 설정
$ vi /etc/grub.d/00_header
G를 눌러 제일 마지막 부분으로 이동
o를 눌러 편집모드로 들어가서 해당 부분 작성
# cat << EOF
# set superusers='ID명'
# password ID명 PW
# EOF
# 이런식으로 작성하면 된다.
cat << EOF
set superusers="grubuser"
password grubuser 1234
EOF
설정내용 부트로더 인식
$ grub2-mkconfig -o /boot/grub2/grub.cfg
$ reboot
실습
# default-target 확인
$ systemctl get-default
# default-target 변경
$ systemctl set-default multi-user.target
$ systemctl set-default graphical.target
# target 전환
$ systemctl isolate multi-user.target 또는 graphical.target