Linux/리눅스 실무의 이해

02-02-01 리눅스의 구조

바우네 2022. 1. 11. 16:49
반응형

리눅스의 구조

부트 매니저

부트 매니저의 개요

  1. 부트 매니저의 정의: 보조기억장치에 위치한 운영체제를 주기억장치로 로드하기 위한 프로그램으로 '부트로더'라고 함
  2. 부트 매니저의 동작 원리
    1. 시스템이 켜지면 BIOS는 디스크의 첫 번째 섹터(0번 섹터)인 부트 섹터에서 512바이트의 MBR(Master Boot Recoder)을 읽는다.
    2. MBR은 크기가 제한되기 때문에 IPL(Initial Program Loader)이라 불리는 부트로더의 일부가 먼저 실행된다. IPL은 파티션 테이블을 검사하여 부트로더의 나머지 코드의 위치를 알아내 실행한다.
    3. 리눅스 부트 매니저 프로그램은 LILO(Linux Loader), GRUB(Grand Unified BootLoader), GRUB2가 있다.

부트 매니저의 종류

/boot/grub/grub.cfg 파일 내용 일부
  1. LILO(LInux LOader)
    1. 모든 리눅스 배포판의 표준이자 가장 오래된 부트로더로서 리눅스 커뮤니티의 지속적인 지원을 받고 있다. 과거 1,024개의 실린더 인식 한계는 개선됐다.
    2. LILO 설정은 /etc/lilo.conf 설정 파일에서 이루어진다. 설정 파일을 변경한 후 부트로더를 MBR로 다시 쓰기 위해 'lilo' 명령을 수행해야 한다.
  2. GRUB(Grand Unified Boot Loader)
    1. GNU 프로젝트에서 만든 부트로더.
    2. LILO와 달리 대화형 명령어 인터페이스를 제공하고 네트워킹 부팅을 제공한다.
    3. 배포판마다 설정 파일명이 다를 수 있는데 CentOS 7의 경우 /boot/grub/grub.conf 파일이 존재한다. LILO와 달리 GRUB는 설정 파일 변경 후 특별한 조치 없이 적용된다.
  3. GRUB2
    1. 기존 GRUB 한계 해결하기 위해 다시 작성했다. 기존의 GRUB은 GRUB Legacy라 한다.
    2. GRUB Legacy는 x86 및 x86-64 아키텍처만 지원했지만, GRUB2는 PowerPC, SPARC(Scalable Process Architectrure)와 같은 다양한 아키텍처를 지원한다.
    3. BIOS, EFI, OpenFirmware와 같은 다양한 펌웨어 유형을 지원한다.
    4. GRUB는 공식적으로 MBR을 통한 부트로더 동작만을 지원하고 GPT(GUID Partition Table)은 비공식적으로 지원하나, GRUB2는 정식으로 지원한다.
    5. GRUB2는 RAID 및 LVM(Logical Volume Manager)을 지원한다.
    6. GRUB2는 애플사의 HFS+(Hierarchical File System), 마이크로소프트 NTFS 파일 시스템, 썬사의 ZFS 등 다른 벤더의 파일 시스템도 지원한다.
    7. GRUB2는 리눅스, FreeBSD, NetBSD, OpenBSD와 같은 운영체제 뿐 아니라, macOS 및 Darwin 커널과 같은 XNU도 부팅할 수 있다.
    8. GRUB2의 환경 설정 파일의 기본 경로는 /boot/grub/grub.cfg이다. CentOS 7은 /boot/grub2/grub.cfg를 사용한다. 이유는 GRUB Legacy를 /boot/grub/grub.cfg에 사용하기 위해서이다.
    9. CentOS 7에서의 기본 부트로더는 GRUB2이다. CentOS 6에서는 기본이 GRUB Legacy이다.

GRUB 사용해보기

GRUB 설정 파일

GRUB2의 'grub.cfg' 파일이 생성될 때 메뉴 항목에 대한 설정들은 /etc/default/grub 파일의 내용을 취하여 생성한다.

/etc/default/grub
  1. GRUB 초기화면
    1. 'e': 해당 목록 부트로더 설정 변경
    2. 'a': 부트로더 설정 중 커널에게 인자 수정
    3. 'c': 명령 줄 모드로 진입
  2. GRUB 편집화면
    1. 'c'를 누르면 편집 화면으로 진입
    2. /boot/grub/grub.conf에 설정되어 있는 root, kernel, inird 설정을 임시로 변경 가능. 여기서 변경한다고 설정 파일에 영구 반영되는 것은 아님.
    3. GRUB 환경 설정 파일
      1. boot: 부팅디스크를 설정
      2. default: 사용자가 아무런 선택을 하지 않을 때 기본으로 부팅할 운영체제 순서.
      3. timeout: 설정된 시간(초 단위) 동안 선택하지 않으면 default에 설정된 운영체제가 로드됨. timeout을 설정하지 않으면 사용자가 선택할 때까지 대기.
      4. splashimage: GRUB 화면의 배경 이미지를 설정하며 형식은 xpm.gz 압축 파일을 사용
      5. title: GRUB 부팅 메뉴에 표시되는 이름
      6. root: 루트 디바이스를 설정. (하드디스크, 부트 파티션 번호)
      7. kernel: 부팅에 사용할 커널 이미지 파일 경로를 지정하고 커널 매개변수를  설정할 수 있음. root 파티션의 위치도 설정할 수 있음
      8. initrd: 리눅스가 부팅하기 위해 필요한 프로그램 및 실행 스크립트가 포함된 이미지를 설정
      9. rootnoverity: 'root'와 유사하나 해당 파티션을 마운트 하지 않는다. NTFS 파티션과 같이 GRUB이 인식할 수 없는 파티션을 root 디바이스로 지정할 때 사용
      10. chainloader+1: 지정한 파티션의 첫 번째 섹터를 읽어 들여 부팅을 하려는 의미
    4. GRUB2 사용해보기(CentOS 7 기준) 
      1. GRUB2 초기 화면
      2. GRUB2 편집 화면
      3. GRUB2 환경 설정 파일 
        1. /boot/grub2/grub.cfg(/etc/grub2.cfg 심볼릭 링크)
        2. [grub2-mkconfig] 명령어를 사용해서 수정
          1. 이 명령어는 /etc/grub.d 이하 스크립트로 작성된 템플릿 파일들과 /etc/default/grub에 정의된 GRUB2 메뉴를 위한 설정값을 가지고 /boot/grub2/grub.cfg 파일을 만들어냄
      4. /etc/default/grub 파일
        1. grub.cfg가 생성될 때 메뉴 항목에 대한 설정들은 /etc/default/grub 파일의 내용을 취하여 생성
        2. /etc/sysconfig/grub 파일은 /etc/default/grub 파일에 대한 심볼릭 링크
          1. GRUB_TIMEOUT은 메뉴 항목이 표시된 후 사용자의 입력을 기다리는 시간
          2. GRUB_DISTRIBUTOR: 메뉴 항목의 제목(title)을 나타냄
          3. GRUB_DEFAULT는 부팅할 때 기본으로 선택할 항목을 뜻함
            1. 0은 첫 번째 메뉴 항목
            2. 1은 두 번째 메뉴 항목
            3. 'saved' 값은 grub2-set-default 명령어와 grub2-reboot 명령어로 설정된 값을 기본 부팅 항목으로 사용하겠다는 의미
            4. GRUB_DISABLE_SUBMENU는 메뉴 항목 하위에 서브 메뉴로 표시할 것인지 여부를 결정
            5. GRUB_CMDLINE_LINUX 커널 부트 파라미터를 설정
            6. GRUB_DISABLE_RECOVERY가 'true'이면 복구를 위한 메뉴 항목이 기본으로 보임

주요 디렉터리 구조

리눅스 파일 시스템 표준(FHS: File system Hierachy Standard)

  1. 리눅스 파일 시스템 표준은 BSD 파일 시스템 계층 구조 기반의 리눅스 디렉터리 구조 표준이다. 이 표준은 비영리조직인 리눅스 재단이 유지 및 관리를 수행하고 있다. 리눅스 재단은 HP, RedHat, IBM, Dell과 같은 주요 소프트웨어 및 하드웨어 공급 업체들로 구성되어 있다.
  2. 최신 버전은 2004년 1월 29일 발표된 2.3

리눅스의 주요 디렉터리

  1. /: 최상위 디렉터리
  2. /bin/:
  3. /boot/:
  4. /dev/
  5. /etc/
  6. /home/
  7. /lib/
  8. /media/
  9. /mnt/
  10. /opt/
  11. /proc/
  12. /root/
  13. /sbin/
  14. /tmp/
  15. /usr/
  16. /usr/bin/
  17. /usr/sbin/
  18. /usr/include/
  19. /usr/lib/
  20. /usr/sbin/
  21. /usr/src/
  22. /var/
  23. /sys/
  24. /run/: 부팅 이후 시스템의 실행 중인 프로세스 또는 로그인한 사용자와 같은 런타임 데이터를 포함하고 있는 디렉터리이다. /var/run은 /run에 대한 심볼릭 링크이다.

부팅과 셧다운

  1. 부팅의 개요
    1. 부팅이란 컴퓨터의 전원이 켜진 후 사용자가 시스템을 사용할 수 있도록 운영체제를 기동 하는 절차
    2. 부팅을 위해서는 BIOS는 MBR로부터 부트로더를 실행. 부트로더는 지정된 위치에서 커널을 메모리에 읽어 들인 후 초기화 프로세스를 실행한다.
  2. 부팅의 상세 절차
    1. 시스템 시작 및 하드웨어 초기화
      1. 컴퓨터 메인보드의 ROM 영역에 저장된 프로그램으로 시스템을 켜면 가장 먼저 실행된다.
      2. 컴퓨터 하드웨어 인식과 각 장치들의 사용을 위한 준비를 수행하는 등 POST(Power On Self Test) 기능을 수행한다. POST는 컴퓨터가 전원이 켜진 후 테스트 과정을 화면에 보여줘야 하기 때문에 그래픽 카드를 먼저 체크한다. 그다음 메인보드와 각 주변 장치가 정상 동작하는지 테스트하고 그 과정 및 결과를 모니터에 출력한다.
    2. 1단계 부트로더
      1. 하드 디스크의 0번 섹터를 특별히 MBR이라고 부르며 운영체제 로드를 위한 1단계 부트로더인 boot.img가 위치한다.
      2. 다음 단계인 2단계 부트로더는 파일 시스템상에 위치한다. 하지만 0번 섹터는 512바이트에 불과하므로 1단계 부트로더가 파일 시스템을 해석할 수 있는 기능을 담기에는 공간이 부족하다. 이에 2단계 부트로더를 위해 파일 시스템을 해석할 수 있는 기능을 가진 중간 단계인 1.5단계 부트로더(core.img)가 필요하며 boot.img에서는 1.5단계 부트로더인 core.img로 점프하는 역할까지만 수행한다.
      3. 1.5단계 부트로더는 0번 섹터 이후 다음 파티션 이전의 공간에 위치한다. 다음 파티션은 63번 섹터에 위치하므로 약 62개의 섹터 공간(약 30킬로바이트)에 걸쳐 1.5단계 부트로더가 위치할 수 있다. 1.5단계 부트로더는 이 공간을 활용해 ext, fat, NTFS와 같은 파일 시스템 드라이버를 포함할 수 있다.
    3. 2단계 부트로더
      1. 1.5단계 부트로더인 core.img는 2단계 부트로더로 로드하고, 2단계 부트로더는 파일 시스템 상에 위치한다.
      2. GRUB Legacy 및 GRUB2는 grub.cfg의 설정에 따라 선택할 수 있는 운영체제 목록을 표시한다.
      3. 사용자가 운영체제를 선택하면 해당 운영체제를 위한 커널을 메모리에 로드하고 해당 커널에게 제어권을 전달한다.
    4. 커널
      1. 커널은 하드웨어와 소프트웨어를 관장하는 핵심 모듈이다.
      2. 커널은 한 번 메모리(RAM)에 로드되면 시스템이 리부팅하거나 종료할 때까지 상주한다.
      3. GRUB으로부터 제어권을 이어받은 커널은 /sbin/init의 프로그램을 실행한다. CentOS 6에서는 init 프로세스를 그대로 실행하고, CentOS 7에서는 심볼릭 링크되어 있는 systemd 프로세스를 실행한다.
    5. INT 프로세스(CentOS 6)
      1. INIT 프로세스는 부팅을 위해 필요한 초기화 작업을 실제로 수행한다.
      2. 가장 먼저 모든 시스템의 프로퍼티, 하드웨어, 디스플레이, SELinux, 커널 모듈, 파일 시스템 마운트 등을 체크하기 위해 /etc/rc.d/rc.sysinit 스크립트를 수행한다.
      3. INIT 프로세스는 /etc/inittab 파일을 읽어 실행 레벨을 확인하고 그에 맞는 스크립트를 실행한다. 가령 실행 레벨이 5인 경우 /etc/rc5.d 디렉터리에 있는 스크립트가 실행된다.
      4. 실행 레벨과 관련된 스크립트가 모두 수행되고 나면 INIT 프로세스는 /etc/rc.local에 정의된 프로세스를 마지막으로 실행한다.
      5. 레벨에 따른 설명
        1. 레벨 0: 시스템의 종료를 의미한다.
        2. 레벨 1: 단일 사용자 모드로 root 권한 셸을 얻는다.
        3. 레벨 2: 다중 사용자 모드이다. 네트워크 기능을 제공하지 않는 텍스트 기반 유저 모드이다.
        4. 레벨 3: 네트워크 기능을 제공하는 다중 사용자 모드이다.
        5. 레벨 4: 현재 사용되고 있지 않은 모드이다.
        6. 레벨 5: X윈도즈를 사용하는 다중 사용자 모드이다.
        7. 레벨 6: 시스템을 리부팅할 때 사용하는 실행 레벨이다.
    6. systemd(CentOS 7)
      1. systemd는 유닛(unit)이라는 단위로 시스템 및 서비스를 제어하는 관리자이다.
      2. 기존에는 /sbin/init 경로에 위치하는 System V 계열의 INIT 프로세스가 PID 1을 가졌지만 CentOS 7부터는 /sbin/init에 심볼릭 링크가 걸려 있는 /lib/system/systemd가 그 역할을 수행한다.
      3. systemd는 부팅 시 여러 서비스 스크립트를 병렬로 실행할 수 있어 리눅스 부팅 시간을 단축할 수 있다. 단 서비스 간의 의존성이 있는 경우는 순차적으로 실행된다.
      4. systemd는 기존의 System V의 init 스크립트와 호환성을 가지지만 몇 옵션에서 제약이 존재한다.
      5. systemd는 다양한 유닛을 제공하며 INIT 프로세스의 실행 레벨의 개념에 대응하는 Target 유닛에 대해 알아둘 필요가 있다. systemd는 부팅 시에 default.target 유닛에 심볼릭 링크되어 있는 Target 유닛을 실행한다. 만약 default.target 유닛이 multi-user.target으로 심볼릭 링크되어 있다면 부팅 시 multi-user.target과 연관된 유닛들이 실행될 것이다. 
      6. 레벨 Target 유닛
        Runlevel Systemd TargetL
        0 runlevel0.target poweroff.target
        1 runlevel1.target rescue.target
        2 runlevel2.target multi-user.target
        3 runlevel3.target multi-user.target
        4 runlevel4.target multi-user.target
        5 runlevel5.target graphical.target
      7. /lib/system/systemd로 링크
    7. 사용자 프롬프트(user prompt)
      1. 모든 초기화가 완료되면 실행 레베에 따라 다르지만 X-Window가 표시되거나 Terminal을 통해 사용자의 입력을 받을 준비가 된다.
      2. 터미널에 유저 로그인 프롬프트 준비
  3. 로그인과 로그아웃
    1. 로그인 
      1. 리눅스는 멀티 유저를 지원하는 운영체제이기 때문에 아이디와 패스워드를 통해 사용자를 식별하고 사용자 간 실행 환경을 독립적으로 제공한다.
      2. INIT 프로세스 또는 systemd 프로세스의 실행 레벨에 따라 단일 사용자 모드, 멀티 유저 모드, X-Window를 통한 멀티 유저 모드로 나눈다.
      3. 모드 실행 레벨 내용
        단일 사용자 모드 1 시스템에 연결된 화면과 키보드를 통해 단일 사용자 로그인 가능
        멀티 유저 모드(터미널) 2, 3 실행 레벨 2의 경우 네트워크를 통한 로그인이 제공되지 않고, 실행 레벨 3의 경우는 네트워크를 통한 로그인 제공
        멀티 유저 모드(X-Window) 5 X 디스플레이 매니저를 통해 구현되는 그래픽 화면을 통해 아이디와 패스워드 입력하여 로그인 가능
      4. 로그인 공지 기능
        1. /etc/issue: 로그인 전 로컬에서 접속 시도할 때 해당 파일의 내용을 표시
        2. /etc/issue.net: 로그인 전 telnet이나 ssh와 같은 프로토콜을 통해 원격 로그인할 때 표시
        3. /etc/motd: 로그인이 성공하면 보여주는 메시지
    2. 로그아웃
      1. 로그인 후 시스템의 사용이 모두 종료되면 로그아웃을 해야 한다. 로그아웃을 하지 않으면 악의적 사용자에게 이용될 수 있다.
      2. 터미널로 로그인했을 경우는 logout 명령으로 로그아웃한다.
      3. X-Window에서 터미널을 실행하였을 경우 exit 명령어를 사용하여 로그아웃할 수 있다. 또는 키보드 Ctrl+D 단축키로 로그아웃이 가능하다.
  4. 시스템 종료
    1. X윈도우 환경에서 셧다운 하기
      1. 우측 상단 전원 아이콘을 클릭하여 시스템을 종료하거나 리부팅할 수 있다.
      2.  
    2. 시스템 종료 방법
      1. shutdown, halt, poweroff, init을 통해 시스템을 종료할 수 있다.
      2. shutdown -h now, halt, poweroff, init 0 등으로 시스템 종료
    3. 시스템을 재부팅하는 방법
      1. 시스템을 재부팅하기 위해 shutdown, reboot, init 명령어를 사용할 수 있다.
      2. shutdown -r now, reboot, init 6 등으로 시스템 재부팅.
    4. 예약된 시간에 시스템을 종료하거나 재시작(reboot)하는 방법
      1. 5분 뒤 종료: shutdown -h +5
      2. 특정 시간 종료: shutdown -h 22:00
      3. 5분 뒤 재부팅: shutdown -r +5
  5. GRUB 패스워드 설정 및 복구
    1. GRUB Legacy 패스워드 설정
      1. 기본적인 방법은 패스워드를 생성하여 /boot/grub/grub.conf에 password로 시작하는 환경설정 줄을 추가하는 것이다. 패스워드를 생성하는 방식은 3가지가 있다. 첫째는 가장 안전한 방법으로 SHA-256 또는 SHA-512로 패스워드를 생성하는 것이다. 두번째는 MD5 방식이다. 이 방법은 해킹에 취약하기 때문에 현재는 권장되지 않는다. 마지막으로 패스워드의 해시를 생성하지 않고 그대로 사용하는 방법이다.
    2. GRUB Legacy 패스워드 복구
      1. root 암호를 알고 있다면 부팅하여 /boot/grub/grub.conf의 password 줄을 삭제하면 된다.
      2. root 암호마저 잊어 버렸다면 설치 디스크를 통해 부팅을 해야 한다. 부팅 후 나타나는 메뉴에서 'Rescue installed system'을 선택한다. 해당 메뉴 진입 시 기본 선택에서 네트워크는 'No', 마운트는 'Continue'를 선택한다. 셸에서 /mnt/sysimage/boot/grub/grub.conf을 편집해 설정했던 password 줄을 삭제하여 GRUB 패스워드를 제거한다.
  6. GRUB2 패스워드 설정 및 복구
    1. GRUB2 패스워드 설정
      1. grub2-mkpasswd-pdkdf2 명령어를 사용하여 패스워드에 대한 해시를 생성한다.
      2. /etc/grub.d/40_custom에 set superusers="root" 줄을 입력하고 다음 줄에 생성된 패스워드를 이어서 입력한다.
      3. grub2-mkconfig 명령어를 통해 grub.cfg를 갱신한다. 잘 갱신되었는지 확인하려면 /boot/grub2/grub.cfg 파일을 열어서 정상적으로 반영되었는지 확인하면 된다.
      4. 재부팅한 후 GRUB 메뉴에서 'e' 명령을 통해 편집하고자 한다면 GRUB2는 username과 password를 요구할 것이다.
      5. /etc/grub.d/40_custom 파일이 아닌 /etc/grub.d/00_header 파일을 수정할 수도 있지만, 00_header 파일은 GRUB 패스워드 설정 외에도 다양한 설정이 존재하므로 혼란을 피하기 위해 40_custom 파일을 사용하는 것이 좋다.
      6. 암호화된 패스워드를 사용하지 않는 경우 password_pbkdf2 대신 password를 사용하면 된다.
      7.  
    2. GRUB2 패스워드 복구
      1. root 패스워드를 알고 있는 경우라면 GRUB Legacy와 마찬가지로 grub.cfg에 설정했던 항목들을 삭제하면 된다. GRUB2의 경우 grub2-mkconfig 명령어를 통해 grub.cfg 파일을 갱신해주는 것만 잊지 않으면 된다.
      2. root 패스워드를 잊은 경우는 복구 시디로 부팅하여 나오는 메뉴에서 'Troubleshooting/Rescue a CentOS system/Continue' 순으로 선택하면 GRUB2  환경 설정 파일에 접근 가능한 셸로 진입한다. 그 다음 /etc/grub.d/40_custom에서 GRUB2 패스워드 설정 부분을 제거하고 grub2-mkconfig 명령으로 갱신해주면 된다.

반응형

'Linux > 리눅스 실무의 이해' 카테고리의 다른 글

02-02-03 파일 시스템의 이해  (0) 2022.01.14
02-02-02 Systemd  (0) 2022.01.12
02-01 리눅스와 하드웨어  (0) 2022.01.11
01-02 리눅스의 기초  (1) 2022.01.02
01-01 운영체제의 개요  (0) 2022.01.01