대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 Speaking UNIX: Ksplice 알아보기
등록일 조회수 4058
첨부파일  

Speaking UNIX: Ksplice 알아보기

다시 부팅할 필요 없이 부팅만으로 충분

Ksplice는 1초도 되지 않는 짧은 시간에 다시 부팅할 필요 없이 작동 중에 커널 패치를 적용합니다. 아무런 문제 없이 시스템 업데이트를 수행하기 위한 실습 안내서를 제공합니다.

 

UNIX(R) 시스템이 도처에서 끊임없이 작동하고 있다. 데스크탑 또는 휴대용 시스템은 몇 주, 아니 몇 달 동안이나 켜진 채로 있을 수 있고, 서버 가동 시간은 1년이나 그 이상으로 연장될 수 있다. 사실, 하드웨어 고장과 자연 재해를 배제할 수 있다면 UNIX 시스템이 영구적으로 작동할 수도 있을 것이다. 불행히도, 하드웨어는 불완전하고 인간이 대자연의 섭리를 모두 헤아릴 수는 없는 법이며 소프트웨어는 늘 버그에 시달린다. 이젠, 변화가 필요한 시점이다. 물론, 뇌우가 발생할 수 있고 실제로 발생한다. 시스템의 경우도 마찬가지여서, 패치를 적용하고 다시 시작해야 할 때가 있다. 죽음이나 세금과 마찬가지로, 중단 시간은 피할 수 없는 일이다.

하지만, 죽음이나 세금과는 달리 중단 시간을 최소화할 수는 있다. 백업 전원과 인터넷에 대한 중복 연결 기능을 충분히 갖춘 강력한 데이터 센터가 그렇듯이, 사전 예방적이고 정기적인 시스템 유지 관리와 핫 스페어를 통해 가용성을 높일 수 있다. 고맙게도, rpm, Aptitude 및 yum과 같은 도구를 사용하여 요청 시 대부분의 애플리케이션과 라이브러리를 원활하게 업데이트할 수도 있다.

불행히도, 커널 업데이트(코어 시스템 소프트웨어의 취약점과 결점을 해결하기 위한 수정)가 그다지 쉽지는 않다. 커널 업데이트를 수행하는 경우 정상적인 시스템 운영이 매우 어려우므로, 중단 시간을 스케줄링하여 영향을 받는 각각의 모든 시스템에서 실행 중인 서비스를 전부 일시적으로 중단해야 한다. 이런 유지 관리가 필수적이고 매우 중요하긴 하지만, 커널 업데이트와 보조를 맞추다 보면 서비스 운영이 마치 요요 현상과 비슷해질 수 있다. 즉, 그림 1의 시간 표시 막대는 2009년 1월에서 2010년 2월 사이에 다양한 인기 운영 체제에 대한 주요 커널 업데이트의 빈도를 나타낸 것이다. 각각의 주기 아이콘은 필수적으로 다시 시작해야 하는 때를 나타낸다(Ksplice, Inc.에서 이미지 제공).

그림 1. 운영 체제별 커널 업데이트 빈도

 

그러나 지금은 운영 체제가 작동할 때 커널을 패치할 수 있으므로, 과거와 같이 다시 시작함으로써 전체적으로 서비스가 중단되는 일이 없다. 다시 말해, 스케줄링된 업그레이드에 더 이상 스케줄이 필요치 않다.

Ksplice는 작동 중에 커널을 제자리에 패치할 수 있는 도구 세트로서, 다시 부팅할 필요가 없다. 기존 커널, 기존 커널의 소스 코드 및 하나 이상의 unified diff 파일(unified diff는 커널 패치의 정식 형태임)이 있는 상태에서, Ksplice는 나머지 커널에 있는 기존의 잘못된 오브젝트 코드를 새 오브젝트 코드로 바꾼다. Ksplice는 프로그램 코드와 데이터 구조를 모두 바꿀 수 있다. kernel splice는 1밀리 초도 되지 않는 짧은 시간 동안만 정상적인 시스템 운영을 방해하므로, 디먼, 프로세스 및 연결이 그대로 유지된다고 설명하는 편이 낫겠다.

Ksplice의 작동 방식을 간단히 살펴보고 Ksplice 도구를 사용하여 커널을 최신 상태로 유지하는 방법을 알아보자. Ksplice를 사용하는 세 가지 방법이 있다.

1.GUI(Graphical User Interface)
2.동등한 상위 레벨 명령행 유틸리티
3.원시 Ksplice 도구(커널에 대한 소스를 가지고 있는 경우)

예를 들어, Ubuntu 버전 9.04 또는 버전 9.10 사용자는 포인트 앤 클릭 애플리케이션을 다운로드하고 설치하여 커널 수정 버전을 선택하고 적용할 수 있다. 여기서 Ksplice의 세 가지 종류를 모두 소개한다.

 

라이브 커널 패치 적용

간결하게 설명하자면, Ksplice는 하나 이상의 취약하거나 불완전한 함수를 새롭고 올바른 구현으로 바꾸어 실행 중인 커널에 패치를 적용한다. 이런 대체 작업을 적용하기 위해, Ksplice 도구는 실행 중인 커널 이미지를 새 함수의 오브젝트 코드로 수정하고 각각의 기존 함수 헤드 부분에 점프를 넣어 새 함수를 호출한다. 함수 호출을 리디렉션하기 위한 몇몇 명령어와 새 오브젝트 코드를 제외하고, 사실상 전체 커널이 변경되지 않은 상태로 남는다.

그 밖에, 약간의 추가적인 프로그래밍이 필요하지만 Ksplice는 데이터 구조에도 영향을 미칠 수 있다. Ksplice는 업데이트 중에 코드를 실행하여 그런 변경 작업을 용이하게 할 수 있다. Ksplice는 커널이 업데이트되기 직전과 직후에 설정 및 해제 코드를 실행하기 위해 한 쌍의 후크도 제공한다. 또한, 커널을 증가시키기 위한 새 함수를 추가할 수도 있다. 새 함수에는 원래 커널에 상응하는 부분이 없다.

Ksplice가 개발되기 전에 제공된 커널을 포함하여, 사실상 모든 커널에 Ksplice를 적용할 수 있다. 커널을 연결(splice)하려면 커널의 소스 코드, 적용할 패치 세트, 오브젝트 코드의 고유한 섹션에 있는 커널의 각 함수와 데이터 구조를 격리할 수 있는 컴파일러가 있어야 한다. 예를 들어, GCC(GNU Compiler Collection)는 올바른 목적을 위해 각각 -ffunction-sections 및 -fdata-sections 플래그를 제공한다(Intel(R) C Compiler와 같은 다른 컴파일러에 유사한 기능이 있음). 이런 "모듈식" 오브젝트 코드는 Ksplice로 더 쉽게 조작할 수 있다. 패치되는 실행 중인 커널은 동일한 특수 옵션으로 컴파일할 필요가 없었다.

Ksplice는 프리 커널로서 원래 소스에서 컴파일된 커널을 가리킨다. 패치된 소스에서 빌드된 새 커널이 포스트 커널이다. 그리고 실행 중인 커널의 별명은 런 커널이다. 프리가 런과 동일하지 않은 경우 Ksplice는 실패하며, 이는 소스 코드가 실행 중인 커널과 일치하지 않음을 분명히 나타낸다. 그런 특수한 조건과는 별개로, Ksplice는 프리와 포스트를 비교하여 각각의 차이가 splice가 된다. 모든 splice는 커널로 주입될 준비가 되어 있는 단일 오브젝트 파일로 묶인다.

Ksplice는 stop_machine 기능(또는 UNIX의 선택 여부에 따라 이와 동일한 다른 기능)을 사용하여 새 코드를 연결(splice)할 준비를 한다. stop_machine을 트래픽 신호로 생각하면 된다. 그러면 다른 CPU는 전부 유휴 상태에 있는 동안 단 하나의 CPU가 계속 연산을 진행할 수 있다. stop_machine을 실행한 후, Ksplice는 바꿀 것으로 표시된 각 함수를 분석하여 함수가 활성 상태인지 확인한다. 단일 스레드의 명령어 포인터가 메모리에 있는 함수의 코드를 참조하거나 단일 스레드의 커널 스택이 해당 함수 내부의 리턴 주소를 참조하는 경우에도 함수는 활성인 것으로 간주되어 바꿀 수 없다. 그렇지 않으면, 함수가 비활성인 것으로 간주되어 바뀐다. Ksplice는 반복적으로 바꾸기를 시도하지만, 결국에는 그런 시도를 포기할 수 있다. 그런 경우, Ksplice는 오류를 보고하고 중지한다.

 

너무나 쉬워진 커널 패치 적용

더 자주 사용되는 UNIX 배포 버전 중 하나를 실행하면, Ksplice를 가장 쉽게 사용할 수 있다. Ksplice의 작성자들은 사용자의 배포 버전에 맞춰 사용자 정의된 클라이언트 애플리케이션을 제공한다. 매월 시스??로 유지할 수 있다. Ksplice 웹 사이트에서 지원되는 운영 체제 목록을 확인할 수 있다(참고자료 참조). Ubuntu 9.04(Jaunty Jackalope) 및 Ubuntu 9.10의 경우 무료로 Ksplice 소프트웨어를 구할 수 있다.

이 기사에서는 Ubuntu 9.10을 데모용으로 사용하여 커널을 연결한다. Ubuntu에서 Ksplice를 사용하려면 Ksplice Uptrack 클라이언트를 다운로드하여 설치해야 한다(링크는 참고자료 참조). Uptrack은 다시 부팅할 필요 없이 사용자의 시스템에 사용 가능한 커널 업데이트를 관리한다. Ksplice 업데이트를 보고 설치할 수 있으며, 새 커널 업데이트를 사용할 수 있을 때 경보를 검토할 수 있다. 이 소프트웨어는 Debian 패키지로 제공된다. wget 또는 cURL과 같은 도구를 사용하여 명령행에서 소프트웨어를 다운로드할 수도 있다.

그 다음, gdebi를 사용하여 패키지를 설치한다. 아직 gdebi가 없으면 다음 명령으로 설치할 수 있다.

sudo apt-get install gdebi

그래픽 클라이언트를 선호하는 경우 다음 명령으로 Ksplice를 설치할 수 있다.

sudo gdebi-gtk ksplice-uptrack.deb

gdebi로 Uptrack과 Uptrack의 종속 항목을 설치하며, 종속 항목에는 kerneloops, YAML 라이브러리, Python 및 cURL 라이브러리가 포함된다(Listing 1 참조).

Listing 1. Uptrack과 Uptrack의 종속 항목 설치

$ wget http://www.ksplice.com/uptrack/dist/karmic/ksplice-uptrack.deb
$ sudo gdebi ksplice-uptrack.deb
Reading package lists: Done
Reading state information: Done
Reading state information: Done
Reading state information: Done
Reading state information: Done

Requires the installation of the following packages:
kerneloops curl libcurl3 python-yaml libyaml-0-1
Client for the Ksplice Uptrack service
The Ksplice Uptrack service enables you to keep your system
up to date and secure without rebooting it.
This package contains the command-line and graphical Uptrack clients.
Do you want to install the software package? [y/N]:y
...

서비스 이용 약관에 동의하고 설치를 마친 후, Uptrack이 자동으로 시작된다. 손쉽게 액세스할 수 있도록, 설치 프로그램에서 자동으로 Ksplice 아이콘(작업 표시줄의 대문자 K)도 배치한다. 그림 2는 Ubuntu 9.10이 올바로 설치되었을 때 처음으로 Uptrack Manager가 시작되는 화면을 나타낸 것이다. 커널을 패치하려면 Install all updates를 클릭한다.

그림 2. Uptrack Manager 시작

 

그림 3에 표시된 진행 표시줄에는 각 패치가 설치될 때 그 과정이 표시된다. 적용해야 할 패치 수가 많더라도 커널을 패치하는 데는 잠깐이면 된다. 물론, 다시 부팅할 필요도 없다.

그림 3. Ksplice 진행 표시줄

 

패치 설치가 완료되면, 그림 4에 표시된 것처럼 Uptrack Manager에서 화면을 새로 고쳐 시스템의 새로운 상태를 표시한다. 녹색 확인 표시는 명명된 패치가 올바로 적용되어 현재 실행 중인 커널에서 작동되고 있음을 나타낸다. Check를 클릭하여 시스템에 사용 가능한 추가 커널 패치를 찾아본다. Close를 클릭하여 창을 해제한다. uptrack-manager를 루트로 실행할 필요는 없고, 소프트웨어에서 수정 사항을 적용하기 전에 관리자 비밀번호를 입력하라는 메시지가 표시된다.

그림 4. Uptrack Manager의 현재 시스템 상태

 

uptrack-manager 명령으로 나중에 언제든 Uptrack Manager를 열거나 작업 표시줄의 K 아이콘을 클릭할 수 있다. Ksplice는 일단 실행된 후에는 계속 작동한다. 원한다면 실행 중인 커널에 자동으로 패치를 적용하거나 그냥 업데이트를 사용할 수 있게 될 때 이를 알리도록 Ksplice를 구성할 수 있다. 예를 들어, 자동 패치 적용을 선택하려면 /etc/uptrack/uptrack.conf 파일을 편집하여 autoinstall 행을 다음으로 변경한다.

autoinstall = yes

update-manager 외에, Uptrack Manager에는 편의상 세 가지 다른 명령행 유틸리티가 포함된다. (이들 유틸리티는 커널 소스로 직접 작업하는 데 사용되는 도구와는 다르며, 다음 섹션에서 이를 설명한다.) uptrack-upgrade로 사용 가능한 최신 커널 업데이트를 설치하고, uptrack-remove id로 ID id 태그가 지정된 커널 업데이트를 제거한다. uptrack-remove --all을 입력하면 uptrack-remove를 통해 설치된 업데이트가 전부 제거된다. uptrack-show를 입력하면 현재 설치되어 있는 업데이트 목록이 표시된다.

Uptrack Manager는 사용자가 보유한 배포 버전의 표준 패키지 관리자 역할을 침해하지 않는다는 점을 꼭 기억해야 한다. Ksplice에서 이루어지는 모든 변경 내용은 실행 중인 커널에 적용되고 메모리에만 존재한다. 따라서 시스템 종료 시 모든 Ksplice 패치가 손실된다. 다음 명령을 실행하는 것과 같이, 일반적인 소프트웨어 유지 관리 절차로 디스크 상의 커널을 계속 업데이트한다.

apt-get update; apt-get upgrade

배포된 소프트웨어에서 새 시스템 업데이트가 있음을 알려줄 때 또는 정기적으로 이 명령을 루트 권한으로 실행한다. 디스크의 커널을 최신 상태로 유지하면 결국 시스템을 다시 시작해야 할 때 시스템이 사용 가능한 최상의 커널로 부팅할 수 있다.

 

사용자 정의 커널 업데이트

Uptrack Manager는 벤더 또는 커뮤니티 프로젝트에 의해 빌드 및 배포된 커널을 기반으로 하는 데스크탑 및 서버 컴퓨터에 편리한 옵션이다. 그래도 Uptrack Manager가 게시되어 알려진 운영 체제와 커널을 비교하여 연결(splice)을 생성할 수 없기 때문에 커널이 로컬에서 사용자 정의 및 빌드되는 경우에는 Uptrack Manager가 작동하지 않는다. 하지만, Ksplice의 "원시적인" 유틸리티를 사용하여 공용 패치를 분석하고 고유한 연결(splice)을 작성할 수 있다.

커널 빌드 방법에 대한 설명은 본 기사의 주제에서 벗어나는 내용이다. 프로세스에 익숙하지 않은 경우, 인터넷 곳곳에 훌륭한 명령어와 다수의 괜찮은 튜토리얼이 있다. 그 대신, 우리는 Ksplice에서 제공하는 도구와 어떤 커널이든 빌드할 수 있게 되었을 때 계속 진행하는 방법에 초점을 맞추자.

Ksplice는 커널 연결을 작성하기 위해 ksplice-create라는 유틸리티를 제공한다. 이 명령을 사용하려면 두 가지를 입력해야 하는데, 첫째는 패치 파일이고 둘째는 이미 적용된 이전의 모든 패치를 포함하여 실행 중인 커널에 대한 전체 소스 트리이다. 현재 소스 코드와 패치가 있으면, Ksplice에서 상기한 바와 같이 두 개의 커널을 생성하고 수정 내용을 원본과 비교한다. ksplice-create의 출력은 ksplice-apply로 적용 가능한 연결(splice)이다. ksplice-remove로 커널에서 연결을 편집할 수 있다.

다음은 prctl이라는 패치 파일과 커널 소스 디렉토리 ~/src를 사용하여 "prctl 취약점"(CVE-2006-2451)에 대한 업데이트를 작성하는 예제이다(작성자의 논문에서 발췌하여 명시적 권한으로 사용된 예제임).

$ ksplice-create --patch=prctl ~/src
Ksplice update tarball written to ksplice-8c4o6u.tar.gz
$ sudo ksplice-apply ./ksplice-8c4o6u.tar.gz
Done!

첫 번째 명령을 실행하면 커널로 패치되는 오브젝트 코드의 타볼(tarball) ksplice-8c4o6u.tar.gz가 생성된다. 두 번째 명령으로는 타볼을 읽고 필요한 보수 작업을 계산하고 연결을 적용할 수 있다.

 

하루 24시간, 1년 365일 보장

Ksplice는 검증된 기술이다. 작성자의 원고와 기술 연구에 따르면, Ksplice는 2006년에서 2008년 사이에 발행된 모든 보안 및 기능 패치로 Linux(R) 커널을 동적으로 패치할 수 있었다고 한다. 그 중에서 2/3 이상이 커널을 업데이트하는 데 특수한 코드가 필요하지 않았다. 나머지 패치 중에서 특수한 프로그래밍이 필요했던 분량은 패치당 평균 17행의 코드였다.

Ksplice 접근 방식의 타당성을 증명하기 위해 Linux가 선택되었다. Linux 소스는 폭넓고 빈번하게 결점이 있는지 조사되고 있고 결점을 빠르게 해결하기 위해 자주 패치된다. 하지만, Ksplice는 BSD와 Sun Solaris를 포함하여 소스 코드를 사용할 수 있는 모든 커널에 맞춰 바로 조정될 수 있다. Ksplice는 x86, x86_64 및 ARM 프로세서도 지원한다.

 

 

필자소개

Martin Streicher는 프리랜서 Ruby on Rails 개발자이며 Linux Magazine의 편집장을 역임했다. Purdue University에서 컴퓨터 과학 석사 학위를 받았으며 1986년부터 UNIX 계열 시스템을 프로그래밍하고 있다. 그리고 예술 작품과 장난감 수집을 좋아한다.

출처 : 한국 IBM

제공 : DB포탈사이트 DBguide.net