Simulation is ...

Virtual = Real

Flight Sim 자세히보기

ㆍ Linux

Linux, 부팅, swap, dependency, booting

FlightSim 2023. 8. 30. 14:15
320x100

Linux 시스템이 너무 빨리 부팅되어 대부분의 출력이 너무 빨리 스크롤되어 콘솔로 전송된 텍스트(시작 중인 서비스 표시)를 읽을 수 없습니다. 따라서 부팅 문제/오류를 관찰하는 것은 우리에게 약간의 도전이 됩니다.

이 기사에서는 Linux 시스템 부팅 프로세스의 여러 단계를 간략하게 설명한 다음 부팅 문제를 설정하고 해결하는 방법을 알아봅니다. 즉, 조사할 파일 또는 시스템 부팅 메시지를 보기 위한 명령을 사용합니다.

Linux 부트 프로세스 요약

요약하면 전원 켜기 버튼을 누르면 BIOS(Basic Input Output System) 마더보드에 통합된 프로그램이 >POST(Power on Self Test) – 디스크, RAM(Random Access Memory), 키보드 등과 같은 하드웨어를 검사하는 곳입니다. 오류(하드웨어 누락/오작동)가 발생하면 화면에 보고됩니다.

POST 동안 BIOS는 부팅 장치, 부팅할 디스크(일반적으로 첫 번째 하드 디스크이지만 DVD, USB로 구성할 수 있음)도 찾습니다. , 대신 네트워크 카드 등).

그런 다음 시스템은 디스크에 연결하고 부트 로더(크기 446바이트)를 저장하는 마스터 부트 레코드(크기 512바이트)와 디스크 파티션에 대한 정보를 저장하는 나머지 공간을 검색합니다. (최대 4개) 및 MBR 자체.

부트 로더는 커널 및 initrd 파일(초기화 램 디스크 – /에 저장된 마운트된 루트 파일 시스템 및 모듈/드라이버에 대한 커널 액세스를 제공합니다. lib 디렉토리), 일반적으로 파일 시스템의 /boot 디렉토리에 저장됩니다.

커널이 로드된 후 PID 1이 있는 첫 번째 프로세스인 init(또는 최신 Linux 배포판에서 systemd)를 실행하면 시스템의 다른 모든 프로세스가 시작됩니다. 또한 시스템 종료 시 실행되는 마지막 프로세스이기도 합니다.

Linux 부팅 문제 또는 오류 메시지를 찾는 방법

앞에서 언급했듯이 Linux 부팅 프로세스는 콘솔로 전송되는 대부분의 출력을 명확하게 읽을 수도 없을 정도로 빠르게 발생합니다.

따라서 부팅 문제/오류를 기록하려면 시스템 관리자가 특정 명령과 함께 중요한 특정 파일을 조사해야 합니다. 여기에는 다음이 포함됩니다.

/var/log/boot.log – 시스템 부팅 메시지를 기록합니다.

이것은 아마도 시스템 부팅 중에 펼쳐지는 모든 것을 보기 위해 조사하려는 첫 번째 파일일 것입니다.

부팅하는 동안 화면의 출력을 따르려고 애쓰는 대신 부팅 프로세스가 완료된 후 이 파일을 확인하여 부팅 문제/오류를 확인하고 해결하는 데 도움을 받을 수 있습니다.

우리는 다음과 같은 용도로 cat 명령을 사용합니다(아래는 이 파일의 샘플입니다).

# cat /var/log/boot.log
[  OK  ] Started Load/Save RF Kill Switch Status.
[ TIME ] Timed out waiting for device dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.device.
[DEPEND] Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c208ed615.
[DEPEND] Dependency failed for Swap.
[  OK  ] Reached target System Initialization.
[  OK  ] Listening on UUID daemon activation socket.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Listening on CUPS Scheduler.
[  OK  ] Started Daily apt activities.
[  OK  ] Reached target Timers.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Started ACPI Events Check.
[  OK  ] Started Trigger resolvconf update for networkd DNS.
[  OK  ] Started CUPS Scheduler.
[  OK  ] Reached target Paths.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on ACPID Listen Socket.
         Starting Console System Startup Logging...
[  OK  ] Listening on Cockpit Web Service Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
         Starting LSB: Set the CPU Frequency Scaling governor to "ondemand"...
[  OK  ] Started ACPI event daemon.
[  OK  ] Started mintsystem.service.
         Starting Detect the available GPUs and deal with any system changes...
         Starting LSB: daemon to balance interrupts for SMP systems...
         Starting Bluetooth service...
[  OK  ] Started ClamAV virus database updater.
         Starting LSB: Starts syslogd...
[  OK  ] Started Regular background program processing daemon.
         Starting Modem Manager...
         Starting Accounts Service...
......

위의 출력에서 아래 행으로 표시된 부팅 문제가 있음을 알 수 있습니다.

[DEPEND] Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c208ed615.
[DEPEND] Dependency failed for Swap.

문제: 스왑 파티션에 문제가 있습니다. 시스템이 스왑 파일/장치/파티션을 읽지 못했거나 존재하지 않습니다.

시스템이 free 명령으로 스왑 공간을 사용하고 있는지 확인합시다.

# free

total        used        free      shared  buff/cache   available
Mem:        3742792     2421060      433696      287376      888036      967000
Swap:             0           0           0
 

또는 swapon 명령을 실행하여 시스템 스왑 공간 사용량 요약을 볼 수 있습니다(출력을 얻지 않음).

# swapon -s

Linux에서 스왑 공간을 생성하여 이 문제를 해결할 수 있습니다.

참고: 이 파일의 내용은 시스템 종료 시 지워집니다. 새 데이터는 새 부팅 시 저장됩니다.

/var/log/messages – 일반 시스템 로그

이 파일은 시스템 부팅 중에 기록되는 메시지를 포함하여 일반 시스템 메시지를 저장합니다.

보려면 다음을 입력하십시오.

# cat /var/log/messages
Jun  4 13:04:44 tecmint syslogd (GNU inetutils 1.9.4): restart
Jun  4 13:19:55 tecmint -- MARK --
Jun  4 13:39:55 tecmint -- MARK --
Jun  4 13:59:55 tecmint -- MARK --
Jun  4 14:19:55 tecmint -- MARK --
Jun  4 14:20:17 tecmint vmunix: [ 4945.388740] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388837] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388903] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.388930] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.389334] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jun  4 14:20:17 tecmint vmunix: [ 4945.389402] pcieport 0000:00:1c.0: BAR 15: assigned [mem 0xdfa00000-0xdfbfffff 64bit pref]
.....

이 파일은 상대적으로 길 수 있으므로 페이지에서 다음과 같이 more 명령(백분율도 표시)을 사용하여 볼 수 있습니다.

# more /var/log/messages

/var/log/messages의 내용은 이전 파일과 달리 종료되지 않습니다. 부팅 메시지뿐만 아니라 다른 시스템 활동에 관한 메시지도 포함되어 있기 때문입니다. 따라서 오래된 파일은 아래와 같이 나중에 검사할 수 있도록 압축되어 시스템에 보관됩니다.

# ls -l message*

-rw-r--r-- 1 root root 1206127 Jun 10 14:20 messages
-rw-r--r-- 1 root root 1419494 Jun  4 13:00 messages.1
-rw-r--r-- 1 root root  153011 May 28 09:30 messages.2.gz

dmesg – 커널 메시지 표시

dmesg 명령은 부팅 프로세스가 완료되면 커널에 전달된 명령줄 옵션과 같은 작업을 표시할 수 있습니다. 감지된 하드웨어 구성 요소, 새 USB 장치가 추가될 때의 이벤트 또는 NIC(네트워크 인터페이스 카드) 오류와 같은 오류 및 드라이버가 네트워크에서 감지된 링크 활동이 없다고 보고하는 등의 오류가 있습니다.

# dmesg
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic () (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=57b36d48-1938-43c2-bf85-e97bc9f423ea ro quiet splash
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000008ffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000090000-0x00000000000bffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000001fffffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000020000000-0x00000000201fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000020200000-0x0000000040003fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000040004000-0x0000000040004fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000040005000-0x0000000080b2ffff] usable
[    0.000000] BIOS-e820: [mem 0x0000000080b30000-0x0000000080d31fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000080d32000-0x00000000ce3eefff] usable
[    0.000000] BIOS-e820: [mem 0x00000000ce3ef000-0x00000000ce5eefff] type 20
[    0.000000] BIOS-e820: [mem 0x00000000ce5ef000-0x00000000daeeefff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000daeef000-0x00000000daf9efff] ACPI NVS
....

journalctl – Systemd 저널의 쿼리 내용

이는 최신 시스템 및 서비스 관리자인 systemd를 사용하는 대부분의 최신 Linux 배포판에서 유용합니다. 그 아래에서 시스템 로깅은 다양한 구성 요소가 기록한 모든 메시지의 중앙 위치인 저널 구성 요소를 통해 수행됩니다.

이러한 메시지에는 커널 및 부팅 메시지가 포함됩니다. syslog 또는 다양한 서비스의 메시지. 이를 사용하여 출력을 읽고 관심 있는 줄을 식별하여 부팅 메시지를 검토하고 부팅 문제를 설정할 수 있습니다(터미널 텍스트 색상 설정에 따라 빨간색 선으로 표시되는 오류).

# journalctl
Jun 13 16:35:32 tecmint mtp-probe[963]: checking bus 2, device 5: "/sys/devices/pci0000:00/0000:00:1d.0/u
Jun 13 16:35:32 tecmint mtp-probe[963]: bus: 2, device: 5 was not an MTP device
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: Timed out waiting for device dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d
Jun 13 16:35:54 tecmint systemd[1]: Dependency failed for /dev/disk/by-uuid/53e41ce9-dc18-458c-bc08-584c2
Jun 13 16:35:54 tecmint systemd[1]: Dependency failed for Swap.
Jun 13 16:35:54 tecmint systemd[1]: swap.target: Job swap.target/start failed with result 'dependency'.
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: dev-disk-by\x2duuid-53e41ce9\x2ddc18\x2d458c\x2dbc08\x2d584c208ed615.
Jun 13 16:35:54 tecmint systemd[1]: Reached target System Initialization.
Jun 13 16:35:54 tecmint systemd[1]: Started ACPI Events Check.
Jun 13 16:35:54 tecmint systemd[1]: Listening on CUPS Scheduler.
Jun 13 16:35:54 tecmint systemd[1]: Starting Console System Startup Logging...
Jun 13 16:35:54 tecmint systemd[1]: Started Daily Cleanup of Temporary Directories.
 

위는 /var/log/boot.log를 확인하여 이미 식별한 오류인 스왑 파티션 오류를 보여주는 명령 출력의 샘플입니다. 더 많은 출력 라인을 보려면 [Enter] 버튼을 누르십시오.

또한 일반적인 시스템 및 서비스 관리자와 관련된 Linux 시스템 부팅 및 서비스 관리에 대한 다음 유용한 가이드를 확인하십시오.

  1. RHEL 7의 프로세스 관리: 부팅, 종료 및 그 사이의 모든 것
  2. 시스템 시작 프로세스 및 서비스 관리(SysVinit, Systemd 및 Upstart)
  3. 'init' 및 'systemd'의 비하인드 스토리: 'init'이 'systemd'로 대체되어야 하는 이유

 

리눅스 시스템 부팅 프로세스(리눅스 부팅과정)

요약

리눅스 시스템이 올바로 시동하려면 일련의 과정이 올바로 수행되어야 한다.
PC 아키텍처에 직접 설치된 리눅스 시스템은 다음 과정을 거쳐 시동한다.

  • 전원을 켬
  • 하드웨어를 시작함(BIOS 또는 UEFI 펌웨어에서)
  • 부트 로더 위치 찾기 + 시작하기
  • 부트 로더에서 운영체제 고르기
  • 선택된 운영체제에 맞는 커널과 초기 RAM 디스크(initrd) 시작하기
  • 초기화 프로세스(init 또는 systemd) 시작
  • 선택된 런레벨 또는 타깃에 따라 서비스 시작

우리는 위와 같은 일련의 과정을 "부팅(Booting)" 이라 부른다.


시스템 부팅이란

시스템 부팅 프로세스의 목적은 커널을 메모리에 올리고 실행하는 것이다. 봐도봐도 신기하고 어려운 시스템 부팅... 이 포스팅은 리눅스 시스템의 부팅 과정을 4단계로 가시화한 내용을 번역해서 담고 있다. 까먹을 때 마다 구글링하는거 힘들어서 여러가지 레퍼런스를 참고하여 포스팅으로 모았다... 돌아서면 자꾸 까먹는게 문제(눈물)... 
  • Q1. 부팅 전, 커널은 어디에 있지?
  • Q2. 부팅 전, 메모리에는 뭐가 있지?
  • Q3. 부팅 후 첫 번째로 실행되는 것은 뭐지?

리눅스 시스템 부팅 프로세스

리눅스 시스템의 부팅 프로세스를 아래 4단계의 순서로 자세하게 살펴보자

1단계: 하드웨어 단계
2단계: 부트로더 단계
3단계: 커널로드 단계
4단계: INIT 단계(SysV / Systemd)

https://ocw.unican.es/

1단계: 하드웨어 단계

1-1. Power On

  • 파워버튼을 통해 전원이 공급되면 메인보드는 리셋 벡터(Reset Vector)를 통해 CPU가 BIOS 코드를 호출하도록 한다.

  • 모든 Intel CPU들은 전원 공급 직후 초기 부팅 때 real mode로 동작하는데, 이 시점에서는 전체 메모리의 1MB 영역까지만 접근할 수 있다. 이 영역의 주소는 0xFFFFFFFF로, 1978년도의 Intel CPU 8086도, 최신 CPU도 같은 방식으로 동작한다. 

  • 초기부팅 직후 CPU가 처음으로 하게 될 일은 EIP(Extend Instruction Pointer-CPU가 할 일들, 즉 메모리에 등록되어 있는 Code의 주소를 가리키는 포인터)에 숨겨진 0xFFFFFFF0 주소로 점프하는 것이다. 이 주소는 펌웨어(BIOS, EFI)의 엔트리 포인트로 매핑되는 영역으로 리셋 벡터(Reset Vector)라고 한다.  영역은 전원을 켰을 때 항상 같은 자리에 있지만 real mode(초기 부팅 때 전체 메모리의 1MB 영역까지만 접근 가능하지 못함)에서는 접근할 수 없도록 숨겨져 있다. 

  • 즉, 부팅 직후 CPU는 리셋 벡터를 통해 펌웨어(BIOS, EFI)로 접근하고, 이곳에서 펌웨어 코드(BIOS Code)를 실행한다.

  • 특히 BIOS는 레거시 바이오스라고 불리며, 하드디스크의 첫 섹터를 읽어서 첫 섹터에 지시된 주소에 있는 코드를 실행하도록 하는 부팅 절차를 따른다.

  • 펌웨어는 시스템의 하드웨어 구성을 저장한다.

1-2. POST, BOOT SECTOR(MBR/VBR/EBR)

  • Power-on-self-test (POST): "삐~" CPU, RAM, 제어장치, BIOS 코드 자체, 주변장치 등에 대한 검사 진행

  • OS외 기존 가상화 확장, 보안 등에 대한 구성 확인

https://ocw.unican.es/

  • MBR(Master Boot Record)
    POST 과정이 완료되면, BIOS는 부팅 디바이스(하드디스크 등)를 검색하고, 해당 디바이스의 파티션 테이블을 검색한다. 파티션 되지 않은 장치의 시동 섹터는 VBR이 된다. 파티션 테이블을 찾은 경우, 해당 파티션의 첫 번째 블록(섹터 0) 512 bytes의 MBR(Master Boot Record-시동섹터)에서 부트로더 코드(Boot Loader Code=OS Loader)를 검색한다. 부트로더 코드를  찾으면 메모리에 로드시킨다.  

    ㅡ파티션 테이블(Partition Table): 4개 Primary partition 정보(시작~끝 블록, 크기 등) (64bytes)
    ㅡ부트 시그니처(Boot Signature): 부트로더 코드의 고유값(0x55AA) (2 bytes)
  • VBR(Volume Boot Record)
    - 각 Primary partition의 첫 번째 블록(부트로더 코드와 부트시그니처를 포함할 수 있다)
    - 파티션되지 않은 장치의 시동 섹터는 VBR이다.

  • EBR(Extended Boot Record)
    - 각 Logical partition(하나의 파티션을 sub-divide 한 파티션 단위)의 첫 번째 블록(파티션 테이블, VBR 부트시그니처 포함)
    - EBR의 파티션 테이블에는 모든 Logical partition이 링크되어 있다.

2단계: 부트로더 단계

https://ocw.unican.es/

 BIOS가 디스크의 MBR에서 부트 로더를 찾고, 이 부트 로더가 GRUB 설정 파일을 찾으면, 부트로더는 약 3~5초 동안의 시간을 카운트다운한다. 이 시간 동안(기본 운영체제가 시작하기 전까지) 사용자는 아무 키나 눌러 부트 로더에 개입할 수 있게 된다.

일반적으로 유저가 부트 메뉴에서 부트 로더에 개입해야 하는 이유는 다음과 같다.

  • 다른 런레벨로 시작해야 할 때(런레벨 오버라이드)
  • 다른 커널을 선택해야 할 때
    (ex. RHEL의 새 커널이 yum을 통해 설치되면 이전 커널이 하나씩 유지된다. 새 커널이 시작하지 않을 때를 대비하는 것이다)
  • 다른 운영체제를 선택해야 할 때
    (ex. 페도라와 RHEL가 함께 설치된 컴퓨터에서 RHEL이 올바로 동작하지 않을 때 페도라로 시동한 뒤 RHEL 파일 시스템을 마운트하여 문제 해결을 시도할 수 있다)
  • 부트 옵션을 변경해야 할 때
    (ex. 커널 옵션 추가, 특정 구성 요소 하드웨어 지원 비활성화-일시적으로 USB 포트 비활성화 등-)

2-1. GRUB(GRand Unified Bootloader): Linux Loader

  • GRUB은 GRUB Stage1 > 1.5 > 2 의 세 단계를 거치는 부트로더로 현재는 GRUB2가 가장 보편적으로 많이 사용된다.

  • GRUB은 파일시스템과 함께 동작할 수 있음 (ext2, ext3, ext4... 등등)
  • UEFI 버전도 ㅇㅋ(grub.efi)
  • grub> 이라는 고유의 작은 셸을 사용할 수 있음(이 셸의 프롬프트를 통해 부팅 파라미터 및 부팅OS 등을 정의할 수 있음)

3단계: 커널 단계(Loading the Kernel)

부팅 2단계까지 지나며 현재 부트로더는 커널파일과 RAM디스크 파일을 메모리에 로드해놓은 상태이다
ㅡ vmlinux-2.6.26-2-686
ㅡ initrd.img-2.6.26-2-686

커널은 컴퓨터의 각종 하드웨어를 사용하는 데 필요한 드라이버와 모듈을 로드한다. 이 시점에서는 주로 하드웨어 실패를 찾아야 한다. 관련된 기능이 올바로 동작하지 않는 문제를 차단해야 하기 때문이다. (매우 드물지만 특정 하드웨어용 드라이버가 없다거나 엉뚱한 드라이버가 로드되기도 한다)

로드된 커널파일 실행

  • 로드된 커널파일 실행, 콘솔에 관련 정보 띄워줌
  • PCI bus 점검 및 감지된 주변장치(Peripheral) 확인 후 /var/log/dmesg 파일에 기록
  • 커널은 swapper 프로세스(PID 0)를 호출, swapper(PID 0)는 커널이 사용할 각 장치드라이브들을 초기화
  • Root file system (" / ")을 읽기 전용으로 마운트ㅡ이 과정에서 마운트 실패시 "커널 패닉" 메시지 출력
  • 문제없이 커널이 실행되고 나면 언마운트 후 Root File System을 읽기+쓰기 모드로 리마운트
  • 이후 Init 프로세스(PID 1)를 호출

커널이 시작하면서 생성한 메시지들이 복사되는 곳은 커널 링 버퍼(Kernel Ring Buffer)라고 하며, 이를 나중에 참조할 수도 있다. 이곳에 커널 메시지가 저장되며, 버퍼가 모두 채워지면 오래된 순서부터 메시지가 삭제된다. 부팅 후 시스템 로그인하여 커널 메시지를 파일로 캡처하는 커맨드를 통해 커널 메시지 기록을 파일 형태로 남길 수 있다.

커널 메시지는 구성 요소 즉, CPU나 메모리, 네트워크 카드, 하드 드라이브 등이 감지될 때 나타난다.

dmesg > /tmp/kernel_msg.txt
less /tmp/kernel_msg.txt

# systemd는 systemd 저널에 저장된다
# 따라서 journalctl을 실행해야 부트 시부터 지금까지 쌓인 메시지 확인 가능

 

4단계 INIT(sysV)

init 시스템은 SysV 및 Systemd로 구분된다

SysVinit 1. Configuration. the file /etc/inittab

  • /etc/inittab의 초기 시스템 구성 파일을 읽어옴(Operation mode, 런레벨, 콘솔 등)

SysVinit 2. Initialization. the file /etc/init.d/rc

  • /etc/init.d/rc.S(debian) 명령 실행
  • (시스템 초기화-스왑영역 로드, 필요없는 파일 제거, 파일시스템 점검 및 마운트, 네트워크 활성화 등)

SysVinit  3. Services. /etc/init.d 및 /etc/rcN.d 디렉토리들

  • 지정된 런레벨에 해당하는 스크립트 및 서비스 실행
  • /etc/init.d 의 실행 가능한 서비스들 모두 실행(cron, ssh, lpd 등등)
  • 각 런레벨별로 실행할 서비스들은 /etc/rcN.d 에서 정의할 수 있음 (S01: 런레벨 1에서 활성화, K01:런레벨 1에서 비활성화)

4단계 INIT(systemd: BSD init)

systemd는 대표적으로 Ubuntu Linux의 Init System이다.
Sysvinit에 비해 시작속도가 빠르고, 리눅스 시스템을 보조하는 풀타임 프로세스로 상주한다
Target 유닛을 사용하여 부팅, 서비스관리, 동기화 프로세스를 진행한다
System Unit : Any resource that system can operate/manage (ex. .service, .target, .device, .mount, .swap...)

Systemd Boot process

  • systemd용 GRUB2 구성(GRUB_CMDLINE_LINUX="init=/lib/systemd/systemd" (이후 update-grub 실행)
  • 첫 번째 .target 유닛 실행 (보통 graphical.target의 심볼릭 링크임)
#첫 번째 .target 유닛

[Unit]

Description=yon boot target
Requires=multi-user.target
Wants=yonbar.service
After=multi-user.target rescue.service rescue.target
  • Requires = hard dependencies
  • Wants = soft dependencies (시작이 필요하지 않은)
  • After = 여기서 정의된 서비스들 실행 이후에 부팅할 것

reference
1) https://itragdoll.tistory.com/3
2) 쉽게 배우는 운영체제 (조성훈 지음)
3) Wasabi Session
4) https://ocw.unican.es/
5) https://manybutfinite.com/post/how-computers-boot-up/ 

 

Swap Memory 개념 및 swap partition, file 생성 방법

SWAP Memory?

  1. Swap 공간은 RAM이 모두 찼을 때 RAM에서 잘 사용하지 않는 page들을 옮겨 두는 disk 공간이다.
  2. Hard Drive (디스크)에 위치하기 때문에 RAM 보다 느리다.
  3. Swap 공간은 Swap 파티션(권장), Swap 파일, Swap 파티션 + Swap 파일의 방법으로 구성할 수 있다.

하지만 요즘은 RAM의 공급과 사양이 예전에 비해 나아 지면서 굳이 swap을 사용하지 않는 분위기인 것으로 알고 있다.

Swap Partition과 Swap File의 차이점?

A swap partition
 is just what its name implies—a standard disk partition that is designated as swap space by the mkswap command.

A swap file can be used if there is no free disk space in which to create a new swap partition or space in a volume groupwhere a logical volume can be created for swap space. This is just a regular file that is created and preallocated to a specified size.Then the mkswap command is run to configure it as swap space. I don’t recommend using a file for swap space unless absolutely necessary.

즉, swap file은 더 이상 Swap space로 할당할 수 있는 디스크 공간이 없을 때 사용하는 것으로, 일반적인 file을 만든 다음에 mkswap 명령어로 swap 공간으로 지정한다. 꼭 필요하지 않는 이상 권장하지 않음.

 

RAM 크기에 따라 권장되는 Swap 공간

  1. 권장 swap 공간은 OS 설치 중에 자동으로 설정 된다.
  2. 하지만 hibernation 모드를 사용하는 경우에는 사용자가 swap 공간을 수동 편집해야 한다.
    hibernation? : 시스템 전원을 끄기 전에 시스템 메모리에 있는 모든 내용을 Hard disk 와 같은 비활성 메모리에 기록하는 것.

Redhat 문서에서 제공하는 권장 사양은 다음과 같다.

시스템의 RAM 용량 권장 Swap space Hibernation 을 사용할 때의 권장 Swap space
⩽ 2 GB RAM의 두 배 RAM의 3배
> 2 GB – 8 GB RAM과 동일하게 RAM의 2배
> 8 GB – 64 GB 최소 4GB RAM의 1.5배
> 64 GB 최소 4GB Hibernation 권장하지 않음

 

Swap Partition 생성하기

나의 경우에는 이전에 생성한 LVM 파일 시스템을 사용하여 swap 파티션을 생성했다. mkswap 명령어를 이용해여 /dev/vg1/wglv_1 영역을 swap 공간으로 지정한다.

# 이미 filesystem에 마운트 해 놓아서 swap space로 만들 수 없다.
[centos@wglee-server ~]$ sudo mkswap /dev/vg1/wglv_1
mkswap: error: /dev/vg1/wglv_1 is mounted; will not make swap space

# umount
[centos@wglee-server ~]$ sudo umount /dev/vg1/wglv_1

# format the new swap space
[centos@wglee-server ~]$ sudo mkswap /dev/vg1/wglv_1
mkswap: /dev/vg1/wglv_1: warning: wiping old ext4 signature.
Setting up swapspace version 1, size = 15728636 KiB
no label, UUID=a02d074d-417e-4381-b64b-57032f996d8c

# edit /etc/fstab file
[centos@wglee-server ~]$ cat vi /etc/fstab
cat: vi: No such file or directory
UUID=3ef2b806-efd7-4eef-aaa2-2584909365ff /                       xfs     defaults        0 0
#UUID=6028b3e9-4014-45fe-bac7-7e6f53659d46 /data/wglv_1            ext4    defaults,nofail 0 0
UUDI=a02d074d-417e-4381-b64b-57032f996d8c  swap                   swap    defaults        0 0
UUID=653f9039-81c5-43bd-82c7-40245e7c801e /data/wglv_2            ext4    defaults,nofail 0 0

# daemon-reload를 하여 fstab에 등록한 내용으로 mount unit 정보를 갱신한다. (데몬 재시작과는 다르다)
[centos@wglee-server ~]$ sudo systemctl daemon-reload

# 해당 LV에 대해 swap on 시킨다.
[centos@wglee-server ~]$ sudo swapon -v /dev/vg1/wglv_1
swapon /dev/vg1/wglv_1
swapon: /dev/mapper/vg1-wglv_1: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/mapper/vg1-wglv_1: pagesize=4096, swapsize=16106127360, devsize=16106127360

# 다시 swap device를 검색한다. /dev/dm-0가 새롭게 생긴걸 확인 할 수 있다.
[centos@wglee-server ~]$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-0                               partition       15728636        0       -2

# free -h 로 확인
[centos@wglee-server ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           991M        103M        351M         56M        535M        653M
Swap:           14G          0B         14G
--> wglv_1에 대한 14G가 swap space가 되었다!

이제 블록 디바이스 정보를 한번 확인하면 swap 으로 지정한 파일시스템은 [SWAP]으로 보이고 있다.

[centos@wglee-server ~]$ lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda          253:0    0   30G  0 disk
`-vda1       253:1    0   30G  0 part /
vdb          253:16   0   10G  0 disk
`-vg1-wglv_1 252:0    0   15G  0 lvm  [SWAP]
vdc          253:32   0   10G  0 disk
|-vg1-wglv_1 252:0    0   15G  0 lvm  [SWAP]
`-vg1-wglv_2 252:1    0  4.9G  0 lvm  /data/wglv_2

 daemon-reload 
중간에 /etc/fstab을 수정한 다음에 daemon-reload를 하였다. restart 등과 어떤 차이가 있는지 알아보자.

" Reload systemd manager configuration. This will rerun all generators (see systemd.generator(7)), reload all unit files, and recreate the entire dependency tree. While the daemon is being reloaded, all sockets systemd listens on behalf of user configuration will stay accessible. This command should not be confused with the reload command. (daemon-reload won't reload/restart the services themselves, just makes systemd aware of the new configuration) "

즉, daemon-reload는 systemd 서비스 자체를 재구동 하는 것이 아니라 systemd가 변경된 환경 설정을 인지하도록 하는 명령어임을 알 수 있다.

Swap File 생성하기

생성되는 swap file의 block size는 파일크기(MB) * 1024 로 계산하면 된다.
즉, 약 60MB의 파일을 생성하려고 한다면 61440로 block size를 지정하면 된다.

# 난 60MB의 swap file을 만들어야지! (count의 값은 block size를 계산하여 적는다)
[centos@wglee-server ~]$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=61440
61440+0 records in
61440+0 records out
62914560 bytes (63 MB) copied, 2.40773 s, 26.1 MB/s

# swapfile 설정한다.
[centos@wglee-server ~]$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 61436 KiB
no label, UUID=ddee20c0-5a99-4695-a8b1-7610352f209b

# 권한 변경
[centos@wglee-server ~]$ sudo chmod 0600 /swapfile

[centos@wglee-server ~]$ ls /
bin   data  etc   lib    media  opt   root  sbin  swapfile  tmp  var
boot  dev   home  lib64  mnt    proc  run   srv   sys       usr

# /etc/fstab에 등록
[centos@wglee-server ~]$ cat /etc/fstab
UUID=3ef2b806-efd7-4eef-aaa2-2584909365ff /                       xfs     defaults        0 0
#UUID=6028b3e9-4014-45fe-bac7-7e6f53659d46 /data/wglv_1            ext4    defaults,nofail 0 0
UUDI=a02d074d-417e-4381-b64b-57032f996d8c  swap                   swap    defaults        0 0
UUID=653f9039-81c5-43bd-82c7-40245e7c801e /data/wglv_2            ext4    defaults,nofail 0 0
UUID=ddee20c0-5a99-4695-a8b1-7610352f209b swap                    swap    defaults        0 0

# fstab을 변경했기 때문에 damon-reload를 한다.
[centos@wglee-server ~]$ sudo systemctl daemon-reload

# 생성한 swapfile에 대해 swap on 시킨다.
[centos@wglee-server ~]$ sudo swapon /swapfile

# 최종 결과 확인하기
[centos@wglee-server ~]$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-0                               partition       15728636        0       -2
/swapfile                               file            61436   0       -3

[centos@wglee-server ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           991M        105M        288M         56M        597M        650M
Swap:           15G          0B         15G

[centos@wglee-server ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:            991         105         288          56         597         651
Swap:         15419           0       15419

 

Swap Space 줄이기/삭제 하기

Swap 공간 크기를 줄이거나 삭제하는 방법은 다음과 같다.

  1. Swap 영역으로 사용된 LVM2 logical volume 전체를 제거
  2. swap 파일 제거
  3. 기존 LVM2 Logical volume에서 사용하는 swap 공간을 줄이기

이번에는 기존 LV 에서 스왑 공간을 줄이는 방법을 해본다.

# 해당 LV Disable swapping 처리
[centos@wglee-server ~]$ sudo swapoff -v /dev/vg1/wglv_1
swapoff /dev/vg1/wglv_1

# LV 크기 줄이기
[centos@wglee-server ~]$ sudo lvreduce /dev/vg1/wglv_1 -L -1G
  WARNING: Reducing active logical volume to 14.90 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/wglv_1? [y/n]: y
  Size of logical volume vg1/wglv_1 changed from 15.00 GiB (3840 extents) to 14.90 GiB (3815 extents).
  Logical volume vg1/wglv_1 successfully resized.

# format the new swap space
[centos@wglee-server ~]$ sudo mkswap /dev/vg1/wglv_1
mkswap: /dev/vg1/wglv_1: warning: wiping old swap signature.
Setting up swapspace version 1, size = 15626236 KiB
no label, UUID=cac3ef7c-b916-4a8c-ac1b-6bff33e93438

# Swap 활성화
[centos@wglee-server ~]$ sudo swapon -v /dev/vg1/wglv_1
swapon /dev/vg1/wglv_1
swapon: /dev/mapper/vg1-wglv_1: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/mapper/vg1-wglv_1: pagesize=4096, swapsize=16001269760, devsize=16001269760

[centos@wglee-server ~]$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/dm-0                               partition       14577660        0       -3
/swapfile                               file            61436   0       -2

[centos@wglee-server ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           991M        104M        288M         56M        597M        651M
Swap:           13G          0B         13G

참고문서

 

 

320x100
반응형