8장 : 리눅스의 부팅과 종료
지금까지 배운 명령어들로 운영하는 것보다 중요한 것이 부팅과 종료.
1. 바이오스(BIOS) 단계
미세 전류를 하드웨어에 보내 정상 작동이 가능함을 확인(하드웨어 검사 : POST 과정) : 삑! 소리
-> 우선 순위에 따라 부팅 장치 선택
-> 디스크 앞에 있는 MBR(부팅 기본 설정 정보가 있다)을 읽는다(MBR 로드)
-> MBR 뒤에는 부트 섹터가 있는데, 여기에 부트 로더가 있다. 이 정보를 메모리에 올린다(부트 로더 로드)
2. 부트 로더 단계
-> 메모리에 올려진 부트 로더가 여러 OS 중 부팅할 OS를 선택할 수 있도록 메뉴 제공
-> 부트 로더는 리눅스 커널을 메모리에 로딩
-> "/boot/vmlinuz-버전명"의 형태로 리눅스 커널이 제공된다.
-> CentOS 8 버전은 부트 로더를 GRUB 2를 사용.
Windows는 NTLDR 사용
3. 커널 초기화 단계
-> 시스템에 연결된 메모리, 디스크, 키보드 등의 장치 검사
-> fork를 사용하지 않고 생성되는 프로세스와 스레드 생성
-> 얘네들이 메모리 관리 등의 커널의 여러 가지 동작을 수행
4. systemd 서비스 단계 : 이 단계를 배우게 될 것.
-> 모든 프로세스의 조상격인 systemd. PID 1번이다.
기존에는(CentOS 6까지) init 프로세스가 PID 1번으로 모든 프로세스의 조상 역할이었다. 여러 최신 프로그램들을 돌리기 어려워져 대체되었다. 이제는 사용 안함. 기존 사용자들을 고려해 설정 파일이 호환되도록 아직 존재하고는 있다(/etc/rc.d/init.d). 실제 동작은 하지 않음.
런 레벨 : 시스템의 단계를 정의/구분하여 각 단계에 따라 쉘 스크립트를 실행하는데, 이 단계들을 런 레벨이라고 한다.
-> 지금은 저 위치에 없다.
-> 0~3번 정도는 알아둘 것. 셋 다 안전 모드다.
- 단일 사용자 모드(1, S) : 1명만 접속 가능
- 다중 사용자 모드(2) : 여러 명이 로그인은 가능하지만, 로컬 로그인만 가능(NFS를 실행하지 않음)
- 다중 사용자 모드(3) : 2번과 다르게 NFS가 포함된다(네트워크 작동함). 이것이 코어 버전
※ 안전 모드를 들어가는 이유 : 시스템 운영에 필요한 최소한의 프로세스만 동작시키고 나머지는 다 죽인다. 이러고 장애 복구 작업에 들어가는 것이다.
-> runlevel을 실행하면 사용 중인 런 레벨이 출력된다. 우리가 일반적으로 사용 중인 건 5레벨(X11 : GUI 모드로 부팅).
아무튼 이제는 호환적으로 사용되고, 이제는 systemd라는 데몬을 사용.
-> 소켓 기반으로 동작 : initd와 호환성 유지
-> 쉘과 독립적으로 부팅 가능
-> fsck/마운트 제어 가능
-> 보안 강화 : SELinux와 통합이 가능.
(SELinux 관리가 우리 분야에서는 매우 중요!)
systemd가 시스템의 여러 프로세스를 관리해주는데, units이라 부르는 구성 요소로 관리한다.
-> "[서비스 이름].[유닛 종류]"의 형태로 관리. 여기서 나오는 것이 systemctl 명령어.
-> service라는 유닛은 기억해둘 것.
-> 어떤 서비스의 데몬 프로세스의 풀네임은 뒤에 .service가 붙는다.
systemctl [옵션] [명령] [유닛명] : systemd를 기반으로 서비스를 시작하거나 종료. 이 명령어로 systemd 제어.
옵션
-a : 상태와 관계없이 유닛 전체를 출력
-t 유닛 종류 : 지정한 종류의 유닛만 출력
명령
systemctl list-units --type=service : service 타입의 units 출력
systemctl 명령어로 service 관련 유닛들을 제어할 때 뒤에 .service는 안써도 괜찮다
start는 프로그램의 대표 프로세스를 메모리에 올린다. stop은 중지시키는 것. 메모리에는 남아있다.
reload는 가끔 에러가 발생하니 restart를 쓰는 것이 좋다. 유닛의 데몬을 메모리에서 내렸다가 다시 올린다.
status는 서비스의 상태를 보는 명령. active 상태여야 잘 돌아가고 있다는 것. inactive면 메모리에 올라왔지만 작동을 안하고 있다는 것. not be found면 패키지가 설치가 안된 것.
enable은 부팅 시에 해당 유닛이 자동으로 시작되도록 설정. 반대는 disable
위 5개는 잘 기억해둘 것.
systemd 런 레벨
-> systemctl get-default로 현재 런 레벨이 출력된다.
-> systemctl set-default [target 이름].target으로 다음 부팅 시 런 레벨 변경
-> systemctl set-default multi-user.target을 실행하면 다음 부팅에서 코어 모드로 부팅된다.
-> 이 상태에서 systemctl isolate graphical.target으로 GUI 환경으로 전환 가능(런 레벨 변경). 이러면 runlevel에서 "3 5"로 나온다.
※ 주의 : set-default로 poweroff.target이나 reboot.target으로 설정해버리면 대참사 발생. 전자는 아예 안켜지고, 후자는 무한 재부팅
rescue.target : root만 로그인 가능한 복구 모드, 파일 시스템을 rw(읽고 쓸 수 있다)
emergency.target : 긴급 모드, 파일 시스템을 ro(읽기만 가능). 파일 시스템에도 문제가 생겼으면 이걸 사용. root 비밀번호를 잊어버렸을 때 사용(어차피 수정 못하니까)
둘 다 코어 모드고, 문제점 발생 시 사용한다.
수동 rescue 모드 진입 : 처음 OS 선택 화면에서 첫 선택지에 두고 e를 치면 edit 진입
-> linux로 시작하는 줄의 끝으로 가서 한칸 띄고 systemd.unit=rescue.target 입력
-> Ctrl + x로 시작하면 rescue 모드로 시작된다.
emergency 모드는 같은 위치에 rd.break 입력 후 실행
-> 메모리에 있는 상태. 하드디스크를 볼 수 없다.
-> 아주 기초적인 구성만 보이는 상태
-> 다시 루트 디렉터리에 마운트를 해야 한다.
mount -o remount,rw /sysroot
-> 현재 위치가 /sysroot인데, 이걸 리마운트
chroot /sysroot
-> 입력하면 루트 디렉터리에 마운트 완료.
이제 "passwd root"로 root의 비밀번호 변경 가능
-> 그냥 나가면 SELinux가 차단할 것이다. touch /.autorelabel을 만들어 SELinux가 새로 라벨링하도록 한다.
-> root 비밀번호 수정 완료
아무나 emergency 모드로 들어가서 root 비밀번호를 변경하게 할 수는 없다.
-> 커널 파일 수정 모드로 들어가는 "OS 선택 화면에서 e 누르기" 단계에 비밀번호를 걸자.
-> "vi /etc/grub.d/00_header" 들어가서 파일 마지막에 아래 내용 추가
cat << EOF
set superusers="root"
password root redhat
EOF
-> 편집 저장하고 나와서 "grub2-mkconfig -o /boot/grub2/grub.cfg" 입력해서 파일 설정 정보를 동기화시킨다. 직접 수정 X
-> 이제 커널 수정 모드로 넘어갈 때 ID/비밀번호가 걸린다.
-> 그런데 /etc/grub.d/00_header 파일을 보면 걸어놓은 ID/비밀번호가 평문으로 그대로 보인다.
-> "grub2-mkpasswd-pbkdf2" 명령어로 비밀번호를 입력, 암호화시킬 수 있다. 입력한 비밀번호에 대한 해시값이 쭉 나온다.
cat << EOF
set superusers="root"
password_pbkdf2 root 해시값
EOF
으로 수정
실습
의도적으로 장애를 발생시킨 후 reboot해보면 응급 복구 모드로 진입.
비밀번호 치고 로그인해서 이리저리 해결하면 된다.
수정할 때 해당 파티션이 읽기 전용인지, 쓰기도 가능한지 확인
-> "mount -o remount,rw [파일명]"으로 읽기와 쓰기가 가능하게 재설정
- 시스템의 종료
1. shutdown 명령 사용
shutdown [옵션] [시간] [메시지]
-k : 실제 시스템 종료 X. 사용자에게 메시지만 전달
-r : 종료 후 재시작
-h : 종료하며 halt 상태로 이동
-f : 빠른 재시작으로 fcsk 생략 가능
-c : 이전에 내린 shutdown 명령 취소
시간 : hh:mm, +m, now
- halt 명령 사용
- poweoff 명령 사용
- 런 레벨을 0이나 6으로 전환
- reboot 명령 사용
- 전원을 꺼버린다.
데몬 프로세스
데몬
-> 백그라운드에서 동작하며 특정 서비스를 제공하는 프로세스. 메모리에 상주한다.
-> 리눅스 시스템에서 동작하는 각종 서비스를 제공하는 프로세스
동작 방식은 독자형/슈퍼데몬에 의한 동작이 있는데, 이제는 전자만 쓰인다.
독자형(standalone)
-> 시스템 백그라운드에서 서비스별로 항상 동작. 요청에 대한 신속한 응답이 가능
-> 자주 호출되지 않는 프로세스면 자원을 낭비할 우려가 있다.
슈퍼데몬
-> 평소에는 슈퍼데몬만 동작. 서비스 요청이 들어오면 슈퍼데몬이 해당 데몬을 동작시킨다.
-> 자원을 효율적으로 사용하지만, 서비스 응답에 시간이 걸릴 수 있다.
자주 필요하면 전자로, 가끔 필요하면 후자로 쓰곤 했다
CentOS 7부터는 systemd의 도입과 메모리 비용이 내려가서 슈퍼데몬을 쓰려면 따로 설치해야 한다.
커널 스레드 데몬은 그냥 한번 슥 읽어보고
주요 데몬은 httpd, nfs, named, sendmaild, smtpd, popd, smb, syslogd, sshd, ftpd, ntpd 한번 슥 보기
9장 소프트웨어 관리
리눅스 코어 버전에서는 모든 것을 명령어로 다운로드해야 한다.
rpm, yum 사용 예정
RPM(Redhat Package Manager) : 레드햇에서 만든 패키지 관리 도구
- 바이너리 파일로 구성되어 있어 컴파일이 필요 없다.
- 패키지의 파일들이 관련 디렉터리로 바로 설치된다.
- 기존 패키지를 삭제하지 않고 바로 업그레이드 가능
- 설치된 패키지의 파일을 일괄적으로 삭제 가능
- 패키지의 설치 상태 검증 가능
- 패키지에 대한 정보 제공
- 패키지 의존성에 따라 관련 패키지가 먼저 설치되어 있지 않으면 설치 불가.
패키지의 이름 구성은 대강 알아두기
-> 이름 버전 릴리즈 아키텍쳐 확장자
버전 : 주버전.부버전.패치레벨
x86 -> 인텔 CPU, AMD, ...
rpm은 의존성 문제로 설치하지 않을 것. yum 사용 예정.
-> yum은 설치 시에는 좋지만, 설치된 패키지 정보 확인은 rpm이 더 편하다.
rpm -i [설치 옵션] [패키지명] : RPM 패키지 설치
-h : 해시 출력
-v : 설치 과정에 대한 메시지 출력
아래 3개는 알 필요 없다.
--replacefiles : 이미 설치된 다른 패키지의 파일을 덮어써서라도 패키지를 강제로 설치
--replacepkgs : 패키지가 이미 설치되어 있어도 다시 설치
--test : 설치하지는 않고 충돌 사항이 있는지만 점검/보고
rpm 실습
rpmfind.net 들어가서 xterm 검색 후 적절한 버전 다운로드
다운 받고 홈 디렉터리의 다운로드 디렉터리에서 확인하고, 설치하려고 하니 의존성 이슈 펑펑 터지고...
필요하다는거 뜨는대로 싹 설치해줘야 한다.
yum은 yum install xterm-resize* 해주니 의존성 필요한것도 알아서 다 설치/업그레이드해준다.
이렇게 번거로운데도 rpm을 쓰는 이유 : 패키지 정보 검색 - rpm -q[질의 옵션]
a : 전체 패키지 목록 출력
f 파일명 : 파일명을 포함한 패키지명 출력. 파일명은 절대 경로로 작성.
i : 자세한 정보 출력
p 패키지명 : 지정한 패키지의 상세 정보 출력
R : 의존하고 있는 패키지의 목록 출력
e : 패키지 삭제
yum(Yellowdog Updatater Modified)
-> 패키지를 분석해 패키지의 의존성 해결, 원격 자동 업데이트 설치 가능
-> 설치 가능한 패키지에 대한 정보가 담기 저장소를 가지고 있다.
yum 실습
-> httpd 설치, systemctl로 상태 확인 및 구동,
yum 부분은 따로 하자. 지금 정리하다간 놓치겠다
CentOS 7 부터 모듈을 통해 관리
yum 소프트웨어 저장소 활성화
-> name, baseurl, enabled, gpgcheck
CentOS 7부터는 같은 서비스라도 버전이 다르면 둘다 받아서 어떤 버전은 끄고, 어떤 버전은 켜서 사용 가능
-> 모듈 패키지
BaseOS : CentOS 8에 대한 핵심 운영 체제 컨텐츠를 RPM 패키지로 제공
-> 버전관리에 관련되지 않은 저장소. 버전이 다르면 삭제하고 새로운 버전으로 설치해야 한다
Appstream : 컨텐츠에 모듈 및 기존 패키지 형태로 다양한 생명주기를 제공
-> 버전 관리 가능 : 사용하는 버전은 키고, 사용하지 않는 버전은 끄는 방식이 가능
모듈 : 함께 포함되고 일관성 있는 일련의 RPM 패키지를 나타낸다. 일반적으로 특정 버전의 SW App 또는 프로그래밍 언어를 중심으로 구성된다.
모듈에는 App이 있는 패키지, App의 특정 종속성 라이브러리가 있는 패키지, App 설명서가 있는 패키지가 포함되어 있다.
모듈 스트림 : 각 모듈에는 다양한 버전의 컨텐츠가 포함된 모듈 스트림이 하나 이상 있을 수 있다. 각 스트림은 독립적으로 업데이트를 받는다.
모듈 프로필 : 프로필은 특정 사용 사례(서버, 클라이언트, 개발, 최소설치)에 대해 함께 설치되는 특정 패키지 목록이다. 각 모듈에는 프로필이 1개 이상 있을 수 있다.
이쪽은 아예 다시 들으면서 따로 정리해야겠다. 중요한 부분은 아니라지만 이해는 하고 넘어가야겠다.
파일 아카이브 : 파일을 묶어서 하나로 만든 것
tar 기능[옵션] [아카이브 파일] [파일명] : 파일을 주고받거나 백업, 파일 추출을 하기 위해 사용
기능 : c(새로운 tar 파일 생성), t(tar 파일의 내용 출력), x(tar 파일에서 원본 파일 추출), r(새로운 파일 추가), u(수정된 파일 업데이트)
옵션 : f(파일/장치 지정), v(처리하고 있는 파일의 정보 출력), h(심벌릭 링크의 원본 파일 포함), p(파일 복구 시 원래 권한 유지), j(bzip2로 작업), z(gzip으로 작업)
tar 풀 경우에는 -C 옵션을 압축파일명 뒤에 붙이기.
압축/압축 풀기는 한번 훑어보기
1교시 후반 service 유닛
5교시 중후반
6~7교시
'교육' 카테고리의 다른 글
[메모] 21.08.29 : 할 일 (0) | 2021.08.29 |
---|---|
[28일 차] 21.08.27 : Linux Server 7 (0) | 2021.08.27 |
[26일 차] 21.08.25 : Linux Server 5 (0) | 2021.08.25 |
[25일 차] 21.08.24 : Linux Server 4 (0) | 2021.08.24 |
[24일 차] 21.08.23 : Linux Server 3 (0) | 2021.08.23 |
댓글