# 우분투에서 Preempt RT 커널 설치하기

우분투에서 Preempt RT 커널을 설치하는 과정은 다음과 같은 단계로 구성된다. 이 절차를 따라가면서 실시간 커널을 성공적으로 설치할 수 있다.

#### 1. Preempt RT 커널 패치 다운로드

Preempt RT 커널을 설치하려면 먼저 Linux 커널 소스에 Preempt RT 패치를 적용해야 한다. 다음은 필요한 파일을 다운로드하는 절차이다.

1. **우분투 기본 커널 소스 다운로드**\
   터미널에서 아래 명령어를 입력하여 현재 시스템에 맞는 기본 커널 소스를 다운로드한다.

   ```bash
   sudo apt-get update
   sudo apt-get install linux-source
   ```

   이 명령은 기본 커널 소스를 `/usr/src/` 디렉토리에 다운로드한다.
2. **Preempt RT 패치 다운로드**\
   Linux 커널의 특정 버전에 맞는 Preempt RT 패치를 다운로드해야 한다. 커널 버전과 패치 버전은 반드시 일치해야 한다. 최신 패치를 다운로드하려면 아래 사이트에서 다운로드할 수 있다:

   * <https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/>

   원하는 커널 버전에 맞는 `.patch` 파일을 다운로드한다.

#### 2. 커널 소스 추출 및 패치 적용

다운로드한 커널 소스와 Preempt RT 패치를 사용하여 커널을 컴파일할 준비를 한다.

1. **커널 소스 추출**\
   `/usr/src/` 디렉토리로 이동하여 커널 소스를 추출한다.

   ```bash
   cd /usr/src/
   tar xvf linux-source-<version>.tar.bz2
   cd linux-source-<version>
   ```

   `<version>` 부분은 다운로드한 커널 버전으로 대체한다.
2. **패치 적용**\
   다운로드한 Preempt RT 패치를 커널 소스에 적용한다. 패치 파일이 있는 디렉토리로 이동한 후, 다음 명령을 사용하여 패치를 적용한다.

   ```bash
   patch -p1 < /path/to/patch-<version>-rt.patch
   ```

   여기서 `/path/to/`는 패치 파일의 경로이며, `<version>`은 커널 버전을 의미한다. 이 명령은 커널 소스에 실시간 패치를 적용한다.

#### 3. 커널 설정

커널을 컴파일하기 전에, 설정을 통해 원하는 기능과 옵션을 선택할 수 있다.

1. **기본 설정 파일 복사**\
   기존 커널의 설정 파일을 복사하여 시작할 수 있다. 이는 `/boot/` 디렉토리에서 찾을 수 있다.

   ```bash
   cp /boot/config-$(uname -r) .config
   ```

   이 명령어는 현재 사용 중인 커널의 설정을 기반으로 새로운 커널 설정 파일을 생성한다.
2. **커널 설정 메뉴 실행**\
   다음 명령어로 커널 설정 메뉴를 실행한다.

   ```bash
   make menuconfig
   ```

   이 명령어를 실행하면 터미널에 커널 설정 메뉴가 나타난다. 여기서 다양한 옵션을 설정할 수 있다. 실시간 커널 설정에서는 아래와 같은 항목들을 주의 깊게 설정해야 한다:

   * **Processor type and features**:\
     여기서 `Preemption Model`을 선택하여 `Fully Preemptible Kernel (RT)`을 활성화한다.
   * **Timer frequency**:\
     1000Hz로 설정하는 것이 일반적이다.

#### 4. 커널 컴파일 및 설치

커널 설정을 완료한 후, 커널을 컴파일하고 설치하는 단계이다.

1. **커널 컴파일**\
   다음 명령어로 커널을 컴파일한다:

   ```bash
   make -j$(nproc)
   ```

   이 명령은 시스템의 모든 코어를 사용하여 커널을 컴파일한다. `-j$(nproc)` 옵션은 병렬 컴파일을 위해 사용된다.
2. **모듈 설치**\
   컴파일이 완료되면, 커널 모듈을 설치한다.

   ```bash
   sudo make modules_install
   ```
3. **커널 설치**\
   최종적으로 커널을 설치한다:

   ```bash
   sudo make install
   ```

   이 명령어는 새로운 커널을 `/boot/` 디렉토리에 설치하고, 부트로더에 커널을 추가한다.

#### 5. GRUB을 통한 커널 선택 및 부팅

새로운 커널을 설치한 후, GRUB을 통해 해당 커널로 부팅을 설정할 수 있다.

1. **GRUB 업데이트**\
   새로운 커널을 인식하도록 GRUB을 업데이트한다:

   ```bash
   sudo update-grub
   ```
2. **커널 선택 및 부팅**\
   시스템을 재부팅하면 GRUB 메뉴에서 새로운 Preempt RT 커널을 선택할 수 있다. 원하는 커널을 선택하여 시스템을 부팅한다.

이상으로 우분투에서 Preempt RT 커널을 설치하는 방법에 대해 설명하였다.

#### 6. 설치 확인 및 문제 해결

설치가 완료된 후, 새로운 커널이 올바르게 설치되었는지 확인해야 한다.

1. **커널 버전 확인**\
   시스템이 새로운 커널로 부팅되었는지 확인하기 위해 다음 명령어를 사용한다:

   ```bash
   uname -r
   ```

   이 명령어는 현재 부팅된 커널의 버전을 출력한다. 출력된 버전이 Preempt RT 패치가 적용된 버전인지 확인한다.
2. **실시간 특성 확인**\
   실시간 커널이 올바르게 동작하는지 확인하기 위해, 아래 명령어를 사용하여 실시간 특성을 확인할 수 있다:

   ```bash
   cyclictest -l 100000 -m
   ```

   `cyclictest`는 주기적으로 실시간 성능을 측정하여 레이턴시를 확인하는 유틸리티이다. 이 명령을 통해 시스템의 실시간 성능을 평가할 수 있다. 레이턴시가 낮게 유지되면 커널이 제대로 작동하고 있음을 의미한다.

#### 7. 문제 발생 시 대응 방법

설치 과정에서 문제가 발생할 경우, 아래와 같은 문제 해결 방법을 시도할 수 있다.

1. **부팅 불가 문제**\
   새로운 커널로 부팅이 되지 않는다면, GRUB 메뉴에서 이전에 사용하던 안정적인 커널로 부팅할 수 있다. GRUB 메뉴에서 커널 목록을 확인하고 이전 커널을 선택한다.
2. **컴파일 오류**\
   커널 컴파일 중 오류가 발생하는 경우, 로그 파일을 확인하여 오류의 원인을 파악한다. 오류 메시지를 기반으로 누락된 패키지나 설정 오류를 수정한다. 필요한 경우 패치 버전과 커널 소스 버전을 다시 확인하고 일치 여부를 확인한다.
3. **패치 충돌**\
   특정 커널 버전과 Preempt RT 패치 버전이 충돌할 수 있다. 이 경우, 패치가 적용된 커널 소스를 다운로드하거나, 다른 커널 버전 또는 패치를 시도해 볼 수 있다.

#### 8. 추가 패키지 설치

실시간 애플리케이션 개발을 위해 추가적으로 필요한 패키지를 설치할 수 있다. 대표적으로 `libcgroup`, `rt-tests` 등이 있다.

```bash
sudo apt-get install libcgroup rt-tests
```

이 패키지들은 실시간 성능 테스트 및 그룹화된 자원 관리를 위한 도구를 제공한다.

#### 9. 시스템 최적화

Preempt RT 커널이 설치된 후, 실시간 성능을 극대화하기 위해 시스템을 최적화할 수 있다. CPU 주파수 고정, C-state 비활성화, IRQ 핀 고정 등의 방법을 통해 실시간 성능을 개선할 수 있다. 이 부분에 대해서는 이후 장에서 더 자세히 다루겠다.
