[리눅스마스터 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
를 통해 최신 커널 소스코드를 다운 받을 수 있고, 버전별 이력을 확인할 수 있다.
커널 컴파일 순서
- 커널 소스코드 다운로드
- 가장 먼저 해야할 일은 원하는 커널 버전의 소스코드를 다운받는 것이다.
- 커널 소스코드를 위한 타르볼(tarball)이나 깃허브를 통해 다운 가능하다.
- 다운로드는 원하는 경로에 어디든 상관없고, 보통
/usr/src
에 다운받는다. 다운 받은 패키지를 압축 해제한다.
$ tar xvzl linux-4.17-rc2.tar.gz $ cd linux-4.17-rc2
- 커널 컴파일에 필요한 필수 도구 설치
yum
을 통해 커널 컴파일에 필요한 컴파일러 및 설치 도구를 설치한다.$ sudo yum update $ sudo yum install -y ncurses-devel make gcc bc bison flex elfutils-libelf-devel openssl-devel grub2
- 커널 환경설정
- 커널 환경설정 하기 전 기존의 오브젝트 파일, config 파일, 다양한 백업 파일을 모두 제거한다.
만약 처음 커널 컴파일을 하는 거면 이 과정은 생략 가능하다.
$ make mrproper
- 커널 컴파일이 정상 수행되기 위해 환경설정은 필수이다.
- 기존 커널 설정파일을 복사해서 필요한 부분만 수정하면 편하다.
cp /boot/config-$(uname -r).config
make menuconfig
를 통해 원하는 커널의 기능을 활성화하거나 비활성화한다.- 모든 설정을 마치고 저장하면
.config
파일이 갱신된다.
- 모든 설정을 마치고 저장하면
- 커널 컴파일
- 커널 이미지를 생성하기 위해 컴파일 한다.
- 대표적인 방법으로
zImage
와bzImage
가 있다.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 distclean mrproper의 동작을 모두 수행하고 추가로 백업 및 패치 파일도 모두 제거
- 커널 환경설정
- 텍스트 기반 커널 환경설정부터 그래픽 기반 커널 환경설정까지 다양하다.
환경설정이 해당 항목을 포함하려면
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
파일을 참조한다. insmod
나rmmod
를 통해 수동으로 할 수 있지만,modprobe
를 사용하는 게 간편하다.- 실제로
modprobe
내부적으로는insmod
와rmmod
를 사용해 모듈을 로드하고 제거한다.
- 실제로
형식
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
modprobe
는modules.dep
파일을 바탕으로 모듈 간 의존성을 파악하고 모듈을 로드한다.