2024년 2학기 운영체제실습 2주차 Kernel Compile System Software Laboratory School of Computer and Information Engineering Kwangwoon Univ. Download Kernel Source 참고: sudo 명령어 ▪ ▪ 최고 관리자 (root) 권한으로 프로그램을 실행 ▪ e.g. → 권한이 없어 실패 → root 권한이 생겨 성공 → 본인 계정 비밀번호 입력 → root 계정으로 전환 → 로그인 된 계정이 root로 변경 (최고 권한을 가지고 있으므로 사용에 유의) 2 Download Kernel Source (cont’d) Kernel Source Download ▪ ▪ http://www.kernel.org ▪ Our target kernel: 5.4.282 Download ▪ ▪ $ cd /usr/src ▪ $ sudo wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.282.tar.xz# root 권한 필요 3 Compile Kernel ▪ 전체 과정 $ make menuconfig 커널 환경 설정 (최초 1회 필수, 이후 필요 시 수행) $ make -jn 커널 컴파일 (n: 컴파일을 분할하여 수행할 thread 수) $ make modules_install 컴파일 된 모듈을 /lib/modules 로 이동 $ make install 컴파일 된 커널을 부트로더에 등록 4 Compile Kernel (cont’d) ▪ 참고: vi 명령어 명령키 수행 작업 i 커서 앞에 삽입 a 커서 뒤에 삽입 o 현재 줄 다음에 삽입 I 현재 줄 첫 칸 앞에 텍스트 입력 A 현재 줄 끝에 텍스트 입력 O 현재 줄 앞에 삽입 :q 작업 내용을 저장하였으면 vi 종료 :q! 작업내용을 저장하지 않고 vi 종료 :wq 작업 내용을 저장한 후 vi 종료 :wq 파일명 작업 내용을 지정한 파일명으로 저장한 후 vi 종료 5 Compile Kernel (cont’d) 코드 압축 해제 ▪ ▪ $ tar -xvf linux-5.4.282.tar.xz ▪ $ cd linux-5.4.282 Kernel Extra Version 수정 ▪ $ vi Makefile ▪ ▪ 아래와 같이 본인 학번 삽입 6 Compile Kernel (cont’d) Kernel 환경 설정 ▪ ▪ $ sudo apt install build-essential libncurses5-dev bison flex libssl-dev libelf-dev dwarves zstd ▪ $ sudo make menuconfig 7 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (1) 커널 모듈 적재 시 발생할 수 있는 문제 해결 ▪ “Enable loadable module support” ➔ “Forced module loading” 체크 ▪ → 엔터 → 스페이스 입력 시 [ ] 이 [*] 로 변환 (설정 적용) ▪ ESC 두 번 연속 입력 시 이전 메뉴로 복귀 8 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (2) 컴파일 시 문제가 될 수 있는 모듈 제거 ▪ ▪ “Device Drivers” ➔ “Staging drivers” 체크 해제 → 엔터 → 스페이스 입력 시 [*] 이 [ ] 로 변환 (설정 해제) 9 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (3) 컴파일 시 문제가 될 수 있는 옵션 제거 ▪ ▪ “Binary Emulations” ➔ “x32 ABI for 64-bit mode” 체크 해제 → 엔터 → 엔터 → 스페이스 입력 시 [*] 이 [ ] 로 변환 (설정 해제) 10 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (4) 설정을 파일 (.config)에 저장 ▪ ▪ 방향키 중, 우측 키 세 번을 눌러 “< Save >”로 이동 및 엔터 입력 11 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (3) 설정을 파일 (.config)에 저장 ▪ ▪ “< Ok >” 및 “< Exit >“ 입력으로 환경 설정 완료 12 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (4)시스템 폐기키 및 보안키 비활성화 ▪ ▪ Solution1. 스크립트 활용하여 수정 ▪ $scripts/config --disable SYSTEM_TRUSTED_KEYS ▪ $scripts/config --disable SYSTEM_REVOCATION_KEYS → 추후, make 시 키 요청 발생 공백 상태로 엔터 13 Compile Kernel (cont’d) Kernel 환경 설정 ▪ (4)시스템 폐기키 및 보안키 비활성화(Cont’d) ▪ ▪ Solution2. config 파일 직접 수정 ▪ $sudo vi .config → 해당 값 공란으로 변경 → 해당 값 공란으로 변경 14 Compile Kernel (cont’d) initramfs 설정 변경 ▪ (5)Error : initd is too big 방지를 위한 모듈 설정 ▪ ▪ $cd /etc/initramfs-tools ▪ $vi initramfs.conf → 해당 값 most -> dep 로 변경 15 Compile Kernel (cont’d) Kernel Compile ▪ $ make -jn ▪ ▪ n : 컴파일을 나누어 수행할 thread 수 ▪ 가상 머신에 할당한 CPU core 수의 1.5배 ~ 2배 정도면 적합 Module install ▪ $ make modules_install ▪ Compile된 Kernel을 Boot Loader에 등록 ▪ $ make install ▪ ▪ kernel Image(/arch/x86/boot/bzImage)를 /boot로 복사 ▪ System Map(System.map)을 /boot로 복사 ▪ Grub 부트 로더에 자동 등록 16 Compile Kernel (cont’d) Grub 설정 ▪ Grub ▪ ▪ 대부분의 리눅스 배포판에서 사용하는 부트로더 Grub의 실행과 역할 ▪ ▪ 실행과 동시에 grub 설정 파일을 읽고 boot menu를 화면에 출력 ▪ 사용자가 선택한 kernel image를 메모리에 적재 및 제어권을 커널에 전달 Grub 설정 파일 ▪ ▪ GRUB_DEFAULT : 부팅할 기본 커널 이미지 ▪ GRUB_TIMEOUT_STYLE : 사용자의 선택 스타일 ▪ GRUB_TIMEOUT : 사용자의 선택을 기다리는 시간 ▪ GRUB_CMDLINE_LINUX_DEFAULT : 17 Compile Kernel (cont’d) Grub 설정 ▪ ▪ Grub 설정 파일 수정: $ vi /etc/default/grub ▪ 수정 후 grub 옵션 업데이트 : $sudo update-grub 18 Compile Kernel (cont’d) 재부팅 ▪ ▪ $ reboot ▪ Grub 부트로더 선택 메뉴에서 컴파일한 커널 선택 ▪ 커널 버전 확인 ▪ $ uname -r 19