시스템 시작¶
이 문서에서는 시스템을 시작하는 방법을 배웁니다.
목표: 이 문서에서는 미래의 Linux 관리자가 다음을 수행하는 방법을 배웁니다:
부팅 프로세스의 여러 단계;
Rocky Linux가 GRUB2 및 systemd를 통해 이 부팅을 지원하는 방법;
GRUB2를 공격으로부터 보호하는 방법;
서비스 관리 방법;
journald에서 로그에 액세스하는 방법.
사용자
지식:
복잡성:
소요 시간: 20분
부팅 프로세스¶
문제를 해결할 수 있도록 하기 위해 Linux의 부팅 프로세스를 이해하는 것이 중요합니다.
부팅 프로세스에는 다음이 포함됩니다.
The BIOS startup¶
BIOS (Basic Input/Output System) 는 시스템 하드웨어 구성 요소를 감지, 테스트 및 초기화하기 위해 POST (power on self-test)를 수행합니다.
그런 다음 MBR (Master Boot Record)을 로드합니다.
마스터 부트 레코드 (MBR)¶
마스터 부트 레코드는 부트 디스크의 첫 512바이트입니다. MBR은 부팅 장치를 찾아서 부트로더 GRUB2를 메모리에 로드하고 제어를 전송합니다.
다음 64바이트는 디스크의 파티션 테이블을 포함합니다.
GRUB2 부트로더¶
Rocky 8 배포용 기본 부트로더는 GRUB2(GRand Unified Bootloader)입니다. GRUB2는 이전 GRUB 부트로더(GRUB legacy라고도 함)를 대체합니다.
GRUB 2 구성 파일은 /boot/grub2/grub.cfg
아래에 있지만 이 파일을 직접 편집하면 안 됩니다.
GRUB2 메뉴 구성 설정은 /etc/default/grub
아래에 있으며 grub.cfg
파일을 생성하는 데 사용됩니다.
# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
이러한 매개변수 중 하나 이상을 변경한 경우 grub2-mkconfig
명령을 실행하여 /boot/grub2/grub.cfg
파일을 다시 생성해야 합니다.
[root] # grub2-mkconfig –o /boot/grub2/grub.cfg
- GRUB2는
/boot
디렉토리에서 압축된 커널 이미지(vmlinuz
파일)를 찾습니다. - GRUB2는 커널 이미지를 메모리에 로드하고
initramfs
이미지 파일의 내용을tmpfs
파일 시스템을 사용하여 메모리의 임시 폴더에 추출합니다.
커널¶
커널은 PID 1로 systemd
프로세스를 시작합니다.
root 1 0 0 02:10 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
systemd
¶
Systemd는 모든 시스템 프로세스의 부모입니다. /etc/systemd/system/default.target
링크의 대상(예: /usr/lib/systemd/system/multi-user.target
)을 읽어 시스템의 기본 대상을 결정합니다. 이 파일은 시작할 서비스를 정의합니다.
그런 다음 Systemd는 다음 초기화 작업을 수행하여 시스템을 대상으로 정의된 상태로 설정합니다:
- 머신 이름 설정
- 네트워크 초기화
- SELinux 초기화
- 환영 메시지 표시
- 부팅 시 커널에 전달된 인수를 기반으로 하드웨어 초기화
- 가상 파일 시스템인 /proc을 포함한 파일 시스템 마운트
- /var디렉토리에서 디렉토리 정리
- 가상 메모리 시작(swap)
GRUB2 부트로더 보호하기¶
부트로더를 비밀번호로 보호하는 이유는 무엇입니까?
- 단일 사용자 모드 액세스 방지 - 공격자가 단일 사용자 모드로 부팅할 수 있으면 root 사용자가 됩니다.
- GRUB 콘솔에 대한 액세스 방지 - 공격자가 GRUB 콘솔을 사용할 수 있다면 구성을 변경하거나
cat
명령을 사용하여 시스템에 대한 정보를 수집할 수 있습니다. - 보안 취약한 운영 체제 접근 방지. 시스템에 이중 부팅이 있는 경우, 공격자는 부팅 시에 DOS와 같은 운영 체제를 선택하여 액세스 제어 및 파일 권한을 무시할 수 있습니다.
GRUB2 부트로더를 암호로 보호하려면:
-
/etc/grub.d/10_linux
파일의 기본CLASS=
문에서-unrestricted
를 제거합니다. -
아직 사용자가 구성되지 않은 경우
grub2-setpassword
명령을 사용하여 root 사용자의 비밀번호를 제공합니다:
# grub2-setpassword
이미 존재하지 않는 경우 /boot/grub2/user.cfg
파일이 생성됩니다. 이 파일에는 GRUB2의 해시된 비밀번호가 포함되어 있습니다.
참고
이 명령은 단일 루트 사용자가 있는 구성만 지원합니다.
[root]# cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.CC6F56....A21
grub2-mkconfig
명령을 사용하여 구성 파일을 재생성하세요:
[root]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f9725b0c842348ce9e0bc81968cf7181
Found initrd image: /boot/initramfs-0-rescue-f9725b0c842348ce9e0bc81968cf7181.img
done
- 서버를 다시 시작하고 확인하십시오.
GRUB 메뉴에 정의된 모든 항목은 이제 부팅할 때마다 사용자 이름과 암호를 입력해야 합니다. 시스템은 콘솔에서 직접 사용자 개입 없이 커널을 부팅하지 않습니다.
- 사용자가 요청하면
root
를 입력합니다. - 암호가 요청되면
grub2-setpassword
명령에서 제공된 암호를 입력합니다.
GRUB 메뉴 항목 편집 및 콘솔 액세스만 보호하려면 grub2-setpassword
명령을 실행하는 것으로 충분합니다. 이러한 이유로만 수행하는 경우도 있을 수 있습니다. 이는 서버가 재부팅될 때마다 암호를 입력하는 것이 어렵거나 불가능한 원격 데이터 센터에서 특히 그럴 수 있습니다.
Systemd¶
Systemd는 Linux 운영 체제의 서비스 관리자입니다.
다음을 위해 개발되었습니다.
- 이전 SysV 초기화 스크립트와의 호환성을 유지합니다.
- 시스템 시작 시 시스템 서비스의 병렬 시작, 데몬의 온디맨드 활성화, 스냅샷 지원 또는 서비스 간의 종속성 관리와 같은 많은 기능을 제공합니다.
참고
Systemd는 RedHat/CentOS 7 이후의 기본 초기화 시스템입니다.
Systemd는 systemd 단위의 개념을 도입합니다.
유형 | 파일 확장자 | 기능 |
---|---|---|
Service unit | .service |
시스템 서비스 |
Target unit | .target |
systemd 단위 그룹 |
Mount unit | .automount |
파일 시스템의 자동 마운트 지점 |
참고
장치 단위, 마운트 단위, 경로 단위, 범위 단위, 슬라이스 단위, 스냅샷 단위, 소켓 단위, 스왑 단위, 타이머 단위 등 다양한 유형의 단위가 있습니다.
-
Systemd는 시스템 상태 스냅샷 및 복원을 지원합니다.
-
마운트 지점은 systemd 타겟으로 구성할 수 있습니다.
-
시작 시 systemd는 이 유형의 활성화를 지원하는 모든 시스템 서비스에 대해 수신 대기 소켓을 생성하고 시작될 때 이러한 소켓을 서비스에 전달합니다. 이를 통해 일시적으로 사용할 수 없을 때에도 네트워크에서 보낸 메시지를 수신했던 서비스를 다시 시작할 수 있습니다. 해당 소켓은 접근 가능하며 모든 메시지는 대기열에 유지됩니다.
-
D-BUS를 사용하는 시스템 서비스는 클라이언트가 처음 사용할 때에만 필요한 경우에 요구에 따라 필요할 때 시작될 수 있습니다.
-
Systemd는 실행 중인 서비스만 중지하거나 다시 시작합니다. 이전 버전(RHEL7 이전)은 현재 상태를 확인하지 않고 서비스를 직접 중지하려고 시도했습니다.
-
시스템 서비스는 HOME 및 PATH 환경 변수와 같은 컨텍스트를 상속하지 않습니다. 각 서비스는 자체 실행 컨텍스트에서 작동합니다.
오작동하는 서비스로 인해 시스템이 정지되는 것을 방지하기 위해 모든 서비스 장치 작업에는 5분의 기본 제한 시간이 적용됩니다.
시스템 서비스 관리¶
서비스 단위는 .service
파일 확장자로 끝나며 init 스크립트와 비슷한 목적을 가지고 있습니다. systemctl
명령은 시스템 서비스를 표시
, 시작
, 중지
, 재시작
하는 데 사용됩니다.
systemctl | 설명 |
---|---|
systemctl start name.service | 서비스 시작 |
systemctl stop name.service | 서비스 정지 |
systemctl restart name.service | 서비스 재시작 |
systemctl reload name.service | 구성 파일 다시 로드 |
systemctl status name.service | 서비스가 실행 여부 확인 |
systemctl try-restart name.service | 실행 중인 경우에만 서비스 다시 시작 |
systemctl list-units --type service --all | 모든 서비스의 상태 표시 |
systemctl
명령은 시스템 서비스의 enable
또는 disable
및 관련 서비스 표시에도 사용됩니다.
systemctl | 설명 |
---|---|
systemctl enable name.service | 서비스 활성화 |
systemctl disable name.service | 서비스 비활성화 |
systemctl list-unit-files --type service | 모든 서비스를 목록 및 실행 여부 확인 |
systemctl list-dependencies --after | 지정된 단위보다 먼저 시작하는 서비스 목록 |
systemctl list-dependencies --before | 지정된 단위보다 나중에 시작하는 서비스 목록 |
예시:
systemctl stop nfs-server.service
# 또는
systemctl stop nfs-server
현재 로드된 유닛을 나열하려면:
systemctl list-units --type service
활성화 여부를 확인하기 위해 모든 유닛을 나열하려면:
systemctl list-unit-files --type service
systemctl enable httpd.service
systemctl disable bluetooth.service
postfix 서비스용 .service 파일의 예¶
postfix.service Unit File
What follows is the content of the /usr/lib/systemd/system/postfix.service unit file as currently provided by the postfix package:
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
시스템 타겟 사용¶
Rocky8/RHEL8에서는 실행 수준 개념이 Systemd 타겟으로 대체되었습니다.
Systemd 타겟은 타겟 유닛으로 표시됩니다. 타겟 유닛은 .target
파일 확장자로 끝나며 유일한 목적은 다른 Systemd 장치를 종속성 체인으로 그룹화하는 것입니다.
예를 들어 그래픽 세션을 시작하는 데 사용되는 graphical.target
유닛은 GNOME 디스플레이 매니저(gdm.service
) 또는 계정 서비스(accounts-daemon.service
)와 같은 시스템 서비스를 시작하고 multi-user.target
유닛도 활성화합니다.
마찬가지로 multi-user.target
유닛은 NetworkManager(NetworkManager.service
) 또는 D-Bus(dbus.service
) 와 같은 다른 필수 시스템 서비스를 시작하고 basic.target
이라는 다른 타겟 유닛을 활성화합니다.
타겟 유닛 | 설명 |
---|---|
poweroff.target | 시스템을 종료 |
rescue.target | Rescue 셸 활성화 |
multi-user.target | 그래픽 인터페이스 없이 다중 사용자 시스템 활성화 |
graphical.target | 그래픽 인터페이스로 다중 사용자 시스템 활성화 |
reboot.target | 시스템을 종료하고 다시 시작 |
기본 타겟¶
기본적으로 사용되는 타겟(대상)을 결정하려면 다음을 수행하십시오.
systemctl get-default
이 명령은 /etc/systemd/system/default.target
에 위치한 심볼릭 링크의 대상을 검색하고 결과를 표시합니다.
$ systemctl get-default
graphical.target
systemctl
명령은 사용 가능한 타겟 목록도 제공할 수 있습니다.
systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Encrypted Volumes
getty.target loaded active active Login Prompts
graphical.target loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target loaded active active Paths
remote-fs.target loaded active active Remote File Systems
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
timers.target loaded active active Timers
다른 기본 타겟을 사용하도록 시스템을 구성하려면:
systemctl set-default name.target
예시:
# systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'
현재 세션에서 다른 타겟 장치로 전환하려면:
systemctl isolate name.target
Rescue mode(복구 모드)는 정상적인 부팅 프로세스를 수행할 수 없는 경우 시스템을 수리하기 위한 간단한 환경을 제공합니다.
복구 모드
에서 시스템은모든 로컬 파일 시스템을 마운트하고 여러 중요한 시스템 서비스를 시작하지만 네트워크 인터페이스를 활성화하지 않거나 다른 사용자가 동시에 시스템에 연결되지 않도록합니다.
Rocky 8에서 복구 모드
는 이전 단일 사용자 모드
와 동일하며 root 비밀번호를 요구합니다.
현재 타겟을 변경하고 현재 세션에서 복구 모드
를 진입하려면:
systemctl rescue
Emergency Mode(비상 모드)는 시스템이 복구 모드로 진입할 수 없는 상황에서도 시스템을 복구할 수 있도록 가장 최소한의 환경을 제공합니다. 비상 모드에서 시스템은 읽기 전용으로 root 파일 시스템만 마운트합니다. 다른 로컬 파일 시스템을 마운트하려고 시도하지 않으며 네트워크 인터페이스를 활성화하지 않으며 일부 필수 서비스를 시작합니다.
현재 타겟을 변경하고 현재 세션에서 비상 모드로 전환하려면:
systemctl emergency
종료, 정지 및 최대 절전 모드¶
systemctl
명령은 이전 버전에서 사용된 여러 전원 관리 명령을 대체합니다.
이전 명령 | 새 명령 | 설명 |
---|---|---|
halt |
systemctl halt |
시스템을 중지합니다. |
poweroff |
systemctl poweroff |
시스템의 전원을 끕니다. |
reboot |
systemctl reboot |
시스템을 다시 시작합니다. |
pm-suspend |
systemctl suspend |
시스템을 일시 중단합니다. |
pm-hibernate |
systemctl hibernate |
시스템을 최대 절전 모드로 전환합니다. |
pm-suspend-hybrid |
systemctl hybrid-sleep |
시스템을 최대 절전 모드로 전환하고 일시 중단합니다. |
journald
프로세스¶
로그 파일은 rsyslogd
외에도 systemd
의 구성 요소인 journald
데몬으로 관리할 수 있습니다.
journald
데몬은 Syslog 메시지, 커널 로그 메시지, 초기 RAM 디스크 및 부팅 시작 시 발생하는 메시지, 그리고 모든 서비스의 표준 출력 및 표준 오류 출력에 기록된 메시지를 캡처하고, 인덱싱하여 사용자에게 제공합니다.
구조화되고 인덱싱된 이진 형식의 기본 로그 파일 형식은 검색을 개선하고 더 빠른 작동을 가능하게 하며 타임스탬프 또는 사용자 ID와 같은 메타데이터 정보를 저장합니다.
journalctl
명령¶
journalctl
명령은 로그 파일을 표시합니다.
journalctl
이 명령은 시스템에서 생성된 모든 로그 파일을 나열합니다. 이 출력의 구조는 /var/log/messages/
에서 사용되는 구조와 유사하지만 다음과 같은 개선 사항이 있습니다:
- 항목의 우선 순위는 시각적으로 표시됩니다.
- 타임스탬프는 시스템의 로컬 시간대로 변환됩니다.
- 회전 로그를 포함하여 모든 기록된 데이터가 표시됩니다.
- 시작 부분은 특별한 선으로 표시됩니다.
연속 표시 사용¶
지속적인 표시를 통해 로그 메시지가 실시간으로 표시됩니다.
journalctl -f
이 명령은 가장 최근의 10개 로그 줄 목록을 반환합니다. 그런 다음 journalctl 유틸리티는 계속 실행되고 즉시 변경 사항이 발생할 때까지 기다립니다.
메시지 필터링¶
다양한 필터링 방법을 사용하여 다양한 요구에 맞는 정보를 추출할 수 있습니다. 로그 메시지는 종종 시스템의 잘못된 동작을 추적하는 데 사용됩니다. 선택한 우선순위 이상의 항목을 보려면 다음과 같이 하십시오:
journalctl -p priority
우선 순위를 다음 키워드(또는 숫자) 중 하나로 바꿔야 합니다.
- debug (7),
- info (6),
- notice (5),
- warnung (4),
- err (3),
- crit (2),
- alert (1),
- emerg (0).