LabHub
배우기 러닝패스 코스

LFCS — Linux Foundation System Administrator

The Boot Sequence and Process Signals

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

부팅 단계와 GRUB·타깃 개념을 문서로 정리하고, /proc 을 직접 읽어 시스템 요약을 만들고, 백그라운드 프로세스에 시그널을 보내 상태 변화를 확인한다.

왜 중요한가

부팅이 실패했을 때 어디를 볼지는 "제어권이 어디까지 넘어갔는가" 로 결정된다. 화면에 아무것도 안 나오면 펌웨어와 부트로더 사이, 메뉴는 나오는데 커널 패닉이면 커널과 initramfs 사이, 로그인 프롬프트 직전에 멈추면 init 이후다. 그래서 순서를 외우는 것이 아니라 경계마다 무엇이 바뀌는지를 알아야 한다. 커널 파라미터를 GRUB 에 넣을 때도 일반 항목에만 적용할 것인지 복구 항목까지 적용할 것인지에 따라 지시어가 갈린다. 뒷부분의 시그널 실습은 앞 리딩의 상태 표를 손으로 확인하는 과정이다. 정지는 종료가 아니고, 시그널은 지정한 PID 에만 간다.

단계

  1. /root/lfcs-boot/boot-order.txt 에 부팅 단계 네 개를 순서대로 한 줄씩 적으세요: firmware, bootloader, kernel, init.
  2. /root/lfcs-boot/grub.defaultGRUB_TIMEOUT=5, GRUB_DEFAULT=0, GRUB_CMDLINE_LINUX_DEFAULT="quiet splash", GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0" 네 줄을 적으세요.
  3. /proc/cmdline 의 내용을 그대로 /root/lfcs-boot/cmdline.txt 에 담으세요.
  4. /root/lfcs-boot/sysinfo.txtkernel=<커널 릴리스>, memtotal_kb=<MemTotal 값>, swaptotal_kb=<SwapTotal 값> 세 줄을 적으세요. 값은 숫자만 적습니다.
  5. /root/lfcs-boot/targets.txt 에 런레벨과 타깃의 대응을 네 줄로 적으세요: 0=poweroff.target, 1=rescue.target, 3=multi-user.target, 5=graphical.target.
  6. sleep 4000 을 백그라운드로 띄워 그 PID 를 /root/lfcs-boot/stopped_pid.txt 에 적고, 그 프로세스에 정지 시그널을 보내세요. 그리고 /root/lfcs-boot/stopped.txtstate=<현재 상태 문자> 한 줄을 적으세요.
  7. 두 번째 sleep 4000 을 띄워 그 PID 를 /root/lfcs-boot/term_pid.txt 에 적고, 그 프로세스에만 종료 시그널을 보내 없애세요. 그리고 /root/lfcs-boot/term.txtpid=<그 PID>alive=no 두 줄을 적으세요. 6단계에서 정지시킨 프로세스는 그대로 살아 있어야 합니다.

참고

부팅 단계 정리

/root/lfcs-boot/boot-order.txt 에 부팅 단계 네 개를 순서대로 한 줄씩 적으세요: firmware, bootloader, kernel, init.

전원이 들어온 뒤 제어권이 넘어가는 순서를 네 단계로 적습니다. 소문자 한 단어씩, 한 줄에 하나입니다.

GRUB 기본 설정 파일

/root/lfcs-boot/grub.defaultGRUB_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.txtkernel=<커널 릴리스>, 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.txtstate=<현재 상태 문자> 한 줄을 적으세요.

백그라운드로 띄운 직후의 PID 를 담는 특수 변수가 있습니다. 정지 시그널은 애플리케이션이 잡을 수 없고, 상태 문자는 proc 의 stat 에서도 읽을 수 있습니다.

두 번째 프로세스만 종료하기

두 번째 sleep 4000 을 띄워 그 PID 를 /root/lfcs-boot/term_pid.txt 에 적고, 그 프로세스에만 종료 시그널을 보내 없애세요. 그리고 /root/lfcs-boot/term.txtpid=<그 PID>alive=no 두 줄을 적으세요. 6단계에서 정지시킨 프로세스는 그대로 살아 있어야 합니다.

새로 하나 더 띄워 그 PID 에만 종료 시그널을 보냅니다. 앞 단계에서 정지시킨 프로세스는 반드시 살아 있어야 합니다.