[리눅스마스터 1급] 이기적 이론서 7회차 정리 - 장치의 설치 및 관리

🏁 이기적 이론서 학습 범위

  • PART 01 리눅스 시스템 관리
    • CHAPTER 02 장치 관리 (SECTION 01 장치의 설치 및 관리)

장치의 설치 및 관리

☑️ 리눅스 커널

커널

  • 설명
    • 리눅스 커널은 유닉스 운영체제를 바탕으로 리누스 토발즈가 처음 개발하였고, GNU GPL v2 라이선스 하에 모두에게 무료로 공개되었다.
    • 모노리딕 커널이며 선점형 멀티태스킹, 가상메모리, 공유 라이브러리, 메모리 관리, 네트워킹, 쓰레딩 등 현대 운영체제가 가져야 할 모든 특징을 가지고 있다.
  • 버전 관리 및 배포
    • uname -r 로 현재 커널 버전을 확인한다.

        $ uname -r
        4.18.0-477.10.1el8_8.x86_64
      
      • 가장 앞의 4는 주 버전, 18은 부 버전을 의미한다.
      • 0은 동일한 3.10 버전에 대해 첫 번째 빌드임을 뜻한다.
      • 주 버전은 중대한 변화가 생겼을 때 갱신되고, 부 버전은 기능에 변화가 생기거나 추가됐을 때 갱신된다.
    • kernel.org 를 통해 최신 커널 소스코드를 다운 받을 수 있고, 버전별 이력을 확인할 수 있다.

커널 컴파일 순서

  1. 커널 소스코드 다운로드
    • 가장 먼저 해야할 일은 원하는 커널 버전의 소스코드를 다운받는 것이다.
    • 커널 소스코드를 위한 타르볼(tarball)이나 깃허브를 통해 다운 가능하다.
    • 다운로드는 원하는 경로에 어디든 상관없고, 보통 /usr/src 에 다운받는다.
    • 다운 받은 패키지를 압축 해제한다.

        $ tar xvzl linux-4.17-rc2.tar.gz
        $ cd linux-4.17-rc2
      
  2. 커널 컴파일에 필요한 필수 도구 설치
    • yum 을 통해 커널 컴파일에 필요한 컴파일러 및 설치 도구를 설치한다.

        $ sudo yum update
        $ sudo yum install -y ncurses-devel make gcc bc bison flex elfutils-libelf-devel openssl-devel grub2
      
  3. 커널 환경설정
    • 커널 환경설정 하기 전 기존의 오브젝트 파일, config 파일, 다양한 백업 파일을 모두 제거한다.
    • 만약 처음 커널 컴파일을 하는 거면 이 과정은 생략 가능하다.

        $ make mrproper
      
    • 커널 컴파일이 정상 수행되기 위해 환경설정은 필수이다.
      • 기존 커널 설정파일을 복사해서 필요한 부분만 수정하면 편하다.
        cp /boot/config-$(uname -r).config
      
    • make menuconfig 를 통해 원하는 커널의 기능을 활성화하거나 비활성화한다.
      • 모든 설정을 마치고 저장하면 .config 파일이 갱신된다.
  4. 커널 컴파일
    • 커널 이미지를 생성하기 위해 컴파일 한다.
    • 대표적인 방법으로 zImagebzImage 가 있다.
      • zImage는 1MB 미만의 작은 커널 크기일 때 유용
      • bzImage는 그 이상의 커널을 컴파일 해야 할 때 사용
    • zImage로 컴파일 시 “System is too big” 오류가 발생한다면 더 많은 부분을 모듈로 만들어 커널 크기를 줄이거나 bzImage로 컴파일해야 한다.
      • bzImage는 커널 생성 후 bzip2로 압축해야 한다.
        $ make bzimage
      
    • 커널에서 사용할 모듈을 컴파일한다.

        $ make modules
      
    • 컴파일 완료된 모듈을 /lib/modules/kernel-version 이하에 설치한다.

        $ sudo make install
      
    • 커널 이미지 복사 및 부트로더 환경설정(grub.conf) 등 커널을 시스템에 설치한다.

        $ sudo make modules_install
      
    • 시스템을 재부팅한다.

        $ sudo reboot
        $ uname -r
      

그 외 커널 컴파일 명령

  • 클린 타겟(cleaning targets)
    • 이전에 커널을 컴파일했다면 여러 오브젝트 파일과 환경설정 및 기타 부수 파일들이 존재할 것이다.
    • 남아있는 파일들이 새로운 컴파일에 영향을 줄 수 있으므로 깨끗하게 지워주어야 한다.

      옵션설명
      make clean커널 환경설정을 제외한 대부분의 파일을 모두 제거
      make mrproper커널 환경설정을 포함하여 모든 파일을 모두 제거
      make distcleanmrproper의 동작을 모두 수행하고 추가로 백업 및 패치 파일도 모두 제거
  • 커널 환경설정
    • 텍스트 기반 커널 환경설정부터 그래픽 기반 커널 환경설정까지 다양하다.
    • 환경설정이 해당 항목을 포함하려면 y(yes) , 미포함하려면 n(no) , 모듈로 포함하려면 m(module) 을 선택한다.

      옵션설명
      make config텍스트 기반 환경설정 도구
      make menuconfig텍스트 기반 컬러 메누, 목록, 다이얼로그를 통한 환경설정 도구
      make nconfig- 좀 더 향상된 텍스트 기반 컬러 메뉴를 통한 환경설정 도구이다.
      - F1 ~ F9 의 활용이 가능하고 커서로 쉽게 설정 가능하다.
      make xconfig- X 윈도우 환경의 Qt 기반의 환경설정 도구이다.
      - Qt 4.8 이상 설치가 필요하다.
      make gconfig- X 윈도우 환경의 GTK+ 기반의 환경설정 도구이다.
      - GTK+ 2.0 이상 설치가 필요하다.

☑️ 모듈(Module)

모듈

  • 모듈의 정의
    • 커널의 기능 확장을 위해 메모리에 동적으로 로드 가능한 커널 오브젝트 파일이다.
      • 확장자는 .ko 이다.
    • 시스템 중단 없이 메모리에 동적으로 로드하고 언로드 할 수 있어 리눅스에서는 LKM(Loadable Kernel Module) 이라고 한다.
  • 모듈의 필요성
    • 모듈 없이 운영체제가 제공하는 모든 기능이 커널에 포함되어 있다면 기능 각각의 사용 여부에 관계없이 항상 시스템 메모리를 차지하고 낭비가 발생할 거싱다.
      • 새로운 기능 추가를 위해 커널의 소스 코드를 수정하여 기능을 추가하고 컴파일하고 커널을 교체한 후에 시스템을 다시 시작해야 할 것이다.
    • 모듈을 사용하면 커널은 그대로 두고 사용자가 필요할 때 모듈을 메모리에 로드했다 필요없으면 메모리에서 제거할 수 있다.
      • 필요한 기능이 있으면 모듈로 작성하여 시스템 중단 없이 운영체제가 동작 상태에서 모듈을 동적으로 메모리에 올려 사용할 수 있다.
  • 모듈의 특징
    • 시스템 재시작 없이 모듈을 로드하고, 필요가 없어지면 메모리에서 삭제할 수 있다.
    • 사용자 프로그램이 아닌 커널 일부분으로 시스템 제약 없이 기능을 수행한다.
      • 모듈이 잘못된 동작을 할 경우 시스템이 패닉에 빠질 수 있다.
    • 일반적으로 /lib/modules/kernel-version/kernel 이하에 위치한다. uname -r 을 사용해 현재 사용 중인 커널의 모듈을 확인할 수 있다.

        $ lis /lib/modules/$(uname -r)/kernel
      

모듈 관련 명령어

  • lsmod
    • 현재 로드된 모듈의 리스트와 정보를 출력한다.
    • /proc/modules 파일 내용을 기반으로 보기 좋게 출력된다.
    • 형식

        lsmod
      
    • 예제

        $ lsmod # 현재 로드된 모듈 출력
      
  • insmod
    • 커널에 모듈을 로드한다.
    • 경로를 지정하지 않고 모듈의 파일명만 입력시 /lib/modules/$(uname -r) 에서 모듈을 찾아 로드한다.
    • 모듈 전체 경로를 입력하여 모듈을 로드할 수 있다.
    • insmod 보다는 모듈의 의존성을 고려하는 modprobe 를 주로 사용한다.
      • modprobe 는 내부적으로 insmod 를 사용하여 구현하였다.
    • 형식

        insmod [filename][module-options ...]
      
    • 예제

        $ sudo insmod dummy # 파일명으로 모듈 로드
              
        $ sudo insmod /home/francis/Desktop/dummy.ko # 모듈의 전체 경로를 통해 로드
              
        # 모듈 로드 시 모듈에게 옵션을 넘겨줄 수 있다.
        $ sudo insmod /home/francis/Desktop/dummy.ko mode="standalone" 
      
  • rmmod
    • 커널에서 모듈을 언로드한다.
    • 보통 의존성을 고려하는 modprobe -r 을 통한 모듈 언로드를 선호한다.
    • 형식

        rmmod [filename]
      
    • 예제

        $ sudo rmmod dummy # 파일명으로 모듈 언로드
      
  • modprobe
    • 모듈의 의존성을 고려해 모듈을 커널에 로드하거나 언로드한다.
    • 모듈 로드 전 의존성이 있는 모듈이 있다면 해당 모듈을 먼저 로드 후, 그 다음 대상이 되는 모듈을 로드한다.
    • 모듈 의존성은 depmod 에 의해 생성된 modules.dep 파일을 참조한다.
    • insmodrmmod 를 통해 수동으로 할 수 있지만, modprobe 를 사용하는 게 간편하다.
      • 실제로 modprobe 내부적으로는 insmodrmmod 를 사용해 모듈을 로드하고 제거한다.
    • 형식

        modprobe [option] filename
      
    • 옵션

      옵션의미
      -l, —list로드 가능한 모듈 리스트를 출력한다.
      -r, —remove- 모듈을 제거한다.
      - 의존성 있는 모듈이 존재하고 참조가 없다면 이들도 함께 자동으로 언로드한다.
      - 여러 모듈을 지정할 수 있다.
      -c, —showconfig모듈 관련 환경설정 파일 내용을 모두 출력한다.
    • 예제

        $ sudo modprobe dummy # 파일명으로 모듈 로드
              
        $ sudo modprobe -r dummy # 파일명으로 모듈 제거
              
        $ sudo modprobe -l # 로드 가능한 모듈을 모두 보여줌
              
        $ sudo modprobe e1000e EEE=1 # 모듈에게 옵션을 넘기면서 로드
      
  • modinfo
    • 지정 모듈에 대한 정보를 출력한다.
    • 경로가 주어지지 않으면 /lib/modules/$(uname -r) 경로에서 모듈을 찾는다.
    • 형식

        modinfo [option] filename
      
    • 예제

        $ modinfo e1000 # e1000 모듈의 정보 출력
      

모듈 관련 설정 파일

  • /etc/modprobe.d
    • modprobe 명령을 위한 환경설정 디렉터리다.
      • 해당 디렉터리 이하에 *.conf 인 파일을 생성하면 된다.
    • 현재는 /etc/modprobe.d 파일 하나에 모든 설정을 담는다.

        $ ls /etc/modprobe.d
      
    • /etc/modprobe.d 이하의 .conf 파일을 통해 모듈에 대한 별칭, 옵션, 설치, 제거, 블랙리스트를 지정할 수 있다.
    • 예제

        $ e1000 # 부팅 시 e1000 모듈 로드 (단순 모듈명만 기재하면 된다)
              
        # dummy라는 모듈에 대해 dummy0 별칭 사용
        $ alias dummy0 dummy
              
        # b43 모듈이 커널에 적재될 때마다 nohwcrypt=1 옵션과 qos=0 옵션을 입력한다.
        $ options b45 nohwcrypt=1 quos=0
              
        # modprobe를 통해 ieee1394 모듈을 로드할 때, 실제로 /bin/true 명령을 실행하게 하여 모듈이 로드되지 않도록 한다.
        $ install leee1394 /bin/true
              
        # modprobe로 ieee1394 모듈을 제거할 때, 실제로는 /bin/true 명령을 실행하게 하여 모듈이 제거되지 않도록 한다.
        $ remove ieee1394 /bin/true
              
        # i8xx_tco 모듈이 로드하는 것을 막는다.
        $ blacklist i8xx_lco
      
  • modules.dep
    • depmod 를 사용하여 생성한 모듈 의존성 파일
    • /lib/module/${uname-r} 디렉터리 이하의 모듈을 검사해 해당 디렉터리에 moduels.dep 파일을 생성한다.

        $ sudo depmod -a
      
    • modprobemodules.dep 파일을 바탕으로 모듈 간 의존성을 파악하고 모듈을 로드한다.

© 2021. All rights reserved.

yaejinkong의 블로그