LFCS — Linux Foundation認定システム管理者
起動の流れとプロセスシグナル
한국어 원문으로 표시합니다.
목표
부팅 단계와 GRUB·타깃 개념을 문서로 정리하고, /proc 을 직접 읽어 시스템 요약을 만들고, 백그라운드 프로세스에 시그널을 보내 상태 변화를 확인한다.
왜 중요한가
부팅이 실패했을 때 어디를 볼지는 "제어권이 어디까지 넘어갔는가" 로 결정된다. 화면에 아무것도 안 나오면 펌웨어와 부트로더 사이, 메뉴는 나오는데 커널 패닉이면 커널과 initramfs 사이, 로그인 프롬프트 직전에 멈추면 init 이후다. 그래서 순서를 외우는 것이 아니라 경계마다 무엇이 바뀌는지를 알아야 한다. 커널 파라미터를 GRUB 에 넣을 때도 일반 항목에만 적용할 것인지 복구 항목까지 적용할 것인지에 따라 지시어가 갈린다. 뒷부분의 시그널 실습은 앞 리딩의 상태 표를 손으로 확인하는 과정이다. 정지는 종료가 아니고, 시그널은 지정한 PID 에만 간다.
단계
/root/lfcs-boot/boot-order.txt에 부팅 단계 네 개를 순서대로 한 줄씩 적으세요:firmware,bootloader,kernel,init./root/lfcs-boot/grub.default에GRUB_TIMEOUT=5,GRUB_DEFAULT=0,GRUB_CMDLINE_LINUX_DEFAULT="quiet splash",GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"네 줄을 적으세요./proc/cmdline의 내용을 그대로/root/lfcs-boot/cmdline.txt에 담으세요./root/lfcs-boot/sysinfo.txt에kernel=<커널 릴리스>,memtotal_kb=<MemTotal 값>,swaptotal_kb=<SwapTotal 값>세 줄을 적으세요. 값은 숫자만 적습니다./root/lfcs-boot/targets.txt에 런레벨과 타깃의 대응을 네 줄로 적으세요:0=poweroff.target,1=rescue.target,3=multi-user.target,5=graphical.target.sleep 4000을 백그라운드로 띄워 그 PID 를/root/lfcs-boot/stopped_pid.txt에 적고, 그 프로세스에 정지 시그널을 보내세요. 그리고/root/lfcs-boot/stopped.txt에state=<현재 상태 문자>한 줄을 적으세요.- 두 번째
sleep 4000을 띄워 그 PID 를/root/lfcs-boot/term_pid.txt에 적고, 그 프로세스에만 종료 시그널을 보내 없애세요. 그리고/root/lfcs-boot/term.txt에pid=<그 PID>와alive=no두 줄을 적으세요. 6단계에서 정지시킨 프로세스는 그대로 살아 있어야 합니다.
참고
- 방금 백그라운드로 띄운 프로세스의 PID 는 특수 변수
$!에 들어 있습니다. - 상태 문자는
ps -o stat=로도,/proc/<PID>/stat의 세 번째 항목으로도 읽을 수 있습니다. - 정지 시그널과 강제 종료 시그널은 애플리케이션이 잡을 수도 무시할 수도 없습니다.
- 흔한 실수: 7단계에서 이름으로 시그널을 보내면 6단계의
sleep까지 함께 죽어 채점이 실패합니다. PID 를 지정하세요.
부팅 단계 정리
/root/lfcs-boot/boot-order.txt 에 부팅 단계 네 개를 순서대로 한 줄씩 적으세요: firmware, bootloader, kernel, init.
전원이 들어온 뒤 제어권이 넘어가는 순서를 네 단계로 적습니다. 소문자 한 단어씩, 한 줄에 하나입니다.
GRUB 기본 설정 파일
/root/lfcs-boot/grub.default 에 GRUB_TIMEOUT=5, GRUB_DEFAULT=0, GRUB_CMDLINE_LINUX_DEFAULT="quiet splash", GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" 네 줄을 적으세요.
커널 파라미터를 담는 지시어가 두 개 있습니다. 하나는 일반 항목에만, 다른 하나는 복구 항목까지 포함해 적용됩니다. 값에 공백이 있으면 따옴표로 감싸세요.
지금 커널이 받은 파라미터
/proc/cmdline 의 내용을 그대로 /root/lfcs-boot/cmdline.txt 에 담으세요.
부팅 시 커널에 실제로 넘어간 문자열은 proc 아래 한 파일에 그대로 있습니다. 가공하지 말고 그대로 담으세요.
/proc 에서 시스템 요약 만들기
/root/lfcs-boot/sysinfo.txt 에 kernel=<커널 릴리스>, memtotal_kb=<MemTotal 값>, swaptotal_kb=<SwapTotal 값> 세 줄을 적으세요. 값은 숫자만 적습니다.
커널 릴리스는 uname 으로, 메모리 총량과 스왑 총량은 meminfo 의 해당 줄에서 읽습니다. 단위는 kB 이고 숫자만 적습니다.
런레벨과 타깃 대응
/root/lfcs-boot/targets.txt 에 런레벨과 타깃의 대응을 네 줄로 적으세요: 0=poweroff.target, 1=rescue.target, 3=multi-user.target, 5=graphical.target.
SysV 런레벨 숫자와 systemd 타깃 유닛 이름을 짝지어 적습니다. 정지·단일 사용자·다중 사용자·그래픽 네 가지입니다.
프로세스 정지시키기
sleep 4000 을 백그라운드로 띄워 그 PID 를 /root/lfcs-boot/stopped_pid.txt 에 적고, 그 프로세스에 정지 시그널을 보내세요. 그리고 /root/lfcs-boot/stopped.txt 에 state=<현재 상태 문자> 한 줄을 적으세요.
백그라운드로 띄운 직후의 PID 를 담는 특수 변수가 있습니다. 정지 시그널은 애플리케이션이 잡을 수 없고, 상태 문자는 proc 의 stat 에서도 읽을 수 있습니다.
두 번째 프로세스만 종료하기
두 번째 sleep 4000 을 띄워 그 PID 를 /root/lfcs-boot/term_pid.txt 에 적고, 그 프로세스에만 종료 시그널을 보내 없애세요. 그리고 /root/lfcs-boot/term.txt 에 pid=<그 PID> 와 alive=no 두 줄을 적으세요. 6단계에서 정지시킨 프로세스는 그대로 살아 있어야 합니다.
새로 하나 더 띄워 그 PID 에만 종료 시그널을 보냅니다. 앞 단계에서 정지시킨 프로세스는 반드시 살아 있어야 합니다.