envia

How To Build a Minimal Linux System from Source Code

Greg O'Keefe, gcokeefe@postoffice.utas.edu.au

v0.9, November 2000

그레그 찰스 오키프(Greg Charles O'Keefe)님의 사이트에서 원문을 읽을 수 있고, From Power Up To Bash Prompt 홈 페이지에서 다양한 형식으로 구할 수 있습니다.

이 문서는 KLDP 위키 페이지에서 수정된 내용을 반영하고 있으며, 번역을 하면서 센다 유지(千旦 裕司)님의 일본어 번역판을 참고하였습니다. 이 문서의 내용은 꽤 오래 되었으며 제가 시험해 보지 않았기 때문에 동작하지 않는 것도 있을 수 있습니다.

이 번역은 원문과 마찬가지로 그누 일반 공중 사용 허가서(GNU General Public License)의 규정에 따라 이용할 수 있습니다.


이 문서는 소스 코드로부터 최소한의 리눅스 시스템을 만들기 위한 지시 사항들을 담고 있습니다. 이 문서는 From PowerUp to Bash Prompt의 일부분이었지만, 저는 문서들이 짧고 집중된 상태를 유지하도록 하기 위해, 원래의 문서를 분리하였습니다. 우리가 여기서 만드는 시스템은 매우 작으며, 실제로 작업을 하기에 적합하지 않습니다. 만약 여러분이 실용적인 시스템을 완전히 새로 만들고 싶으시다면 Gerard Beekmans의 Linux From Scratch HOWTO를 대신 보십시오.

준비물

우리는 레드햇과 같은 배포판을 한 파티션에 설치하고, 이를 이용해서 다른 파티션에 새로운 리눅스 시스템을 만들 것입니다. 저는 우리가 만드는 시스템을 대상(target)이라고 부르고, 그것을 만들기 위해 사용하는 시스템을 바탕(source)이라고 부를 것입니다.

따라서 여러분은 두 개의 여유 파티션을 가진 기계가 필요할 것입니다. 가능하다면 중요한 정보가 저장되지 않은 기계를 사용하십시오. 여러분은 이미 설치되어 있는 리눅스를 바탕 시스템으로 쓸 수 있겠지만, 저는 그것을 권장하지 않습니다. 실수로 여러분이 우리가 다루는 명령어의 인자 하나를 잘못 남긴다면, 프로그램들을 바탕 시스템에 설치하게 될 수도 있습니다. 그러면 호환되지 않거나 충돌이 일어나게 될 것입니다.

486이나 그전의 것과 같이 오래된 PC 하드웨어의 바이오스에는 우리를 귀찮게 하는 한계가 있습니다. 그 바이오스들은 첫 512메가바이트 뒤의 하드 디스크를 읽기 못합니다. 이것은 일단 리눅스가 시작되면 바이오스를 건너뛰고 자신만의 디스크 입출력을 수행하기 때문에 큰 문제가 되지는 않습니다. 하지만 오래된 기계에서 리눅스를 읽기 위해서는 커널이 512메가바이트 앞의 영역에 있어야 합니다. 만약 여러분이 이와 같은 기계를 가지고 있다면, 여러분은 완전히 512메가바이트 경계 아래에 있는 독립된 파티션이 필요할 것입니다. 이 파티션은 /boot로 마운트되어 512메가바이트 경계 위에 있는 파티션들을 읽습니다.

제가 최근에 이것을 했을 때, 저는 래드햇 6.1을 바탕 시스템으로 사용하였습니다. 저는 베이스 시스템과

을 설치하였습니다.

저는 문서들을 쉽게 읽기 위해서 X 윈도우와 모질라도 설치하였지만, 이것은 꼭 필요한 것은 아닙니다. 제가 작업을 마쳤을 때, 디스크 공간을 350M 정도 사용하였습니다. (커 보이는군요. 왜 그럴까요?)

완성된 대상 시스템은 650메가바이트를 사용하였지만, 이것은 모든 소스 코드들과 중간 과정의 파일들을 포함한 크기입니다. 공간이 부족하다면 여러분은 각 꾸러미를 설치한 뒤 make clean을 실행해 주어야 할 것입니다. 그래도, 이 당황스럽게 늘어난 크기는 조금 걱정됩니다.

어쨌든, 여러분은 우리가 만드려고 하는 시스템을 위한 소스 코드들이 필요할 것입니다. 제가 이 문서에서 꾸러미라고 부른 것들입니다. 꾸러미들은 소스 CD나 인터넷으로부터 얻을 수 있습니다. 저는 미국과 호주 미러들의 URL을 제시하도록 하겠습니다.

정리하면, 여러분은 다음 준비물이 필요할 것입니다:

저는 여러분이 바탕 시스템을 저의 도움이 전혀 없이 스스로 설치하실 수 있다고 생각합니다. 여기서부터, 저는 여러분이 바탕 시스템의 설치를 끝냈다고 가정하겠습니다.

이 작은 프로젝트의 첫번째 단계의 목표는 커널이 시작 된 뒤 init를 찾을 수 없어서 패닉을 일으키는 것을 보기 위해 커널을 얻는 것입니다. 이것은 우리가 커널과 lilo를 설치해야 한다는 것을 의미합니다. 어쨌든 lilo를 잘 설치하려면 우리는 /dev디렉토리에 있는 디바이스 파일들이 필요합니다. 부트 섹터를 쓰기 위한 저수준의 디스크 액세스를 위해서 lilo는 디바이스 파일들을 필요로 합니다. MAKEDEV는 이러한 디바이스 파일들을 만드는 스크립트입니다. (물론 바탕 시스템에서 디바이스 파일들을 복사해도 되지만, 그건 반칙입니다!) 하지만 무엇보다도 우리는 이 모든 것을 집어넣기 위한 파일 시스템을 필요로 합니다.

파일 시스템

우리의 새 시스템을 파일 시스템 안에 자리잡게 될 것입니다. 그래서 먼저 우리는 mke2fs를 이용해서 파일 시스템을 만들어야 합니다. 그리고 어딘가에 마운트해야 합니다. 저는 /mnt/target을 제안합니다. 이제부터 저는 새 파일 시스템이 그곳에 있다고 가정할 것입니다. 여러분은 바탕 시스템이 시작될 때마다 자동으로 새 파일 시스템을 마운트 할 수 있도록 /etc/fstab에 항목을 추가하여 좀더 편하게 작업할 수도 있을 것입니다.

우리가 대상 시스템을 부팅하게 되면 /mnt/target에 있던 내용들은 /에 있게 될 것입니다.

대상 시스템에는 디렉토리 구조가 있어야 할 것입니다. 이것이 어떠해야 하는지 알기 위해 파일 계층 표준(File Heirarchy Standard)을 확인하시거나(파일시스템을 보십시오.), 그냥 대상이 마운트 된 곳으로 cd 하신 뒤에 아래의 명령들을 입력하십시오.

	mkdir bin boot dev etc home lib mnt root sbin tmp usr var
	cd var; mkdir lock log run spool
	cd ../usr; mkdir bin include lib local sbin share src
	cd share/; mkdir man; cd man
	mkdir man1 man2 man3 ... man9

FHS와 대부분의 꾸러미들은 man 페이지들의 위치에서 차이를 보이기 때문에, 아래의 심볼릭 링크가 필요할 것입니다.

	cd ../..; ln -s share/man man

MAKEDEV

우리는 소스 코드들을 대상의 /usr/src 디렉토리에 넣을 것입니다. 그러므로 예를 들어 여러분의 대상 시스템이 /mnt/target에 마운트되어 있고 여러분의 타르볼(tarball)들은 /root에 있다면 여러분은 아래와 같이 입력해야 할 것입니다.

	cd /mnt/target/usr/src
	tar -xzvf /root/MAKEDEV-2.5.tar.gz

단순히 타르볼을 복사하지 마세요. 그것은 서투른 일입니다. ;)

보통 여러분이 소프트웨어를 설치할 때, 여러분은 그것을 현재 동작하고 있는 시스템 위로 설치합니다. 하지만 우리는 마치 /mnt/target이 루트 파일시스템인 것처럼 설치하고자 하기 때문에 그렇게 해서는 안됩니다. 이런 일을 하는 방법은 꾸러미들에 따라 다릅니다. MAKEDEV를 위해서는 여러분은 아래와 같이 입력하여야 합니다.

	ROOT=/mnt/target make install

여러분은 README나 INSTALL 파일들을 보시거나 ./configure --help를 입력하셔서 옵션들을 찾아보셔야 할 것입니다.

MAKEDEV의 Makefile을 보시고 우리가 위의 명령어로 설정한 ROOT 변수로 무엇을 하는지 알아보십시오. 그 다음에 man ./MAKEDEV.man으로 매뉴얼을 보시고 어떻게 동작하는지 알아보십시오. 여러분은 우리의 디바이스 파일들을 만드는 방법이 cd /mnt/target/dev를 한 뒤, ./MAKEDEV generic을 하는 거라는 것을 아실 수 있을 것입니다. ls를 하셔서 MAKEDEV가 만든 모든 디바이스들을 보십시오.

커널

다음으로 우리는 커널을 만들 것입니다. 저는 여러분이 이것을 전에 해 봤다고 생각하기 때문에, 간단히만 다룰 것입니다. 부트할 수 있는 커널이 있으면 lilo를 설치하기가 쉬워집니다. 대상의 usr/src 디렉토리로 돌아가서 리눅스 커널의 소스를 그곳에 푸십시오. 리눅스 소스 트리로 들어가서(cd linux) 여러분이 좋아하는 방법, 예를 들어 make menuconfig로 커널을 설정하십시오. 여러분은 모듈이 없도록 커널을 설정해서 설치 과정을 조금 더 쉽게 할 수 있을 것입니다. 만약 여러분이 모듈을 사용하도록 설정하셨다면, 여러분은 Makefile에서 INSTALL_MOD_PATH를 찾아 /mnt/target로 설정해야 할 것입니다.

이제 여러분은 make dep, make bzImage을 하실 수 있고, 여러분이 모듈을 설정했다면 make modules, make modules_install도 해야 할 것입니다. 커널 arch/i386/boot/bzImage와 system map System.map을 대상 시스템의 부트 디렉토리인 /mnt/target/boot로 복사하십시오. 이제 우리는 lilo를 설치할 준비가 되었습니다.

Lilo

Lilo에는 QuickInst라고 불리는 깔끔한 스크립트가 포함되어 있습니다. lilo 소스를 대상의 소스 디렉토리에 풀고, ROOT=/mnt/target ./QuickInst와 같이 실행하세요. 스크립트는 여러분에게 어떻게 lilo가 설치될지에 대한 질문을 합니다.

우리가 ROOT를 대상 파티션으로 설정했기 때문에, 파일 이름들을 대상 파티션을 기준으로 한 상대적인 위치로 알려 주어야 합니다. 그래서 기본으로 부트할 커널의 위치에 대해 물어볼 때 /mnt/target/boot/bzImage가 아닌 /boot/bzImage라고 답해야 합니다. 스크립트에 작은 버그가 있기 때문에

	./QuickInst: /boot/bzImage: no such file

라고 나올 것입니다. 하지만 무시하시면 됩니다.

QuickInst가 어디에 부트 섹터를 설치하게 해야 할까요? 우리는 재부팅 했을 때 바탕 시스템이나 대상 시스템, 또는 컴퓨터에 있는 다른 시스템으로 부팅할 수 있도록 선택할 수 있기를 바랍니다. 또한 우리가 지금 만드는 리로가 새로운 시스템의 커널을 읽도록 하고 싶어합니다. 어떻게 우리가 이 두 가지 목표를 다 달성할 수 있을까요? 약간 주제에서 벗어나겠지만 이중 부트 리눅스 시스템에서 lilo가 어떻게 DOS를 부트하는지 알아보도록 합시다. 이러한 파일시스템을 위한 lilo.conf는 아마도 아래와 같을 것입니다.

prompt
timeout = 50
default = linux

image = /boot/bzImage
	label  = linux
	root   = /dev/hda1
	read-only

other = /dev/hda2
	label = dos

이와 같이 설치되면, 마스터 부트 레코드(master boot record)는 바이오스에 의해 읽혀지고 실행된 뒤, 프롬프트를 주는 lilo 부트로더를 부르게 됩니다. 만약 그 프롬프트에서 여러분이 dos라고 치시면 lilo는 hda2의 부트 섹터를 부르게 되고, DOS가 불리게 됩니다.

우리가 하려고 하는 것도 hda2 대신에 QuickInst가 설치하려고 하는 다른 lilo 부트 섹터를 이용하는 것을 제외하면 동일합니다. 그래서 리눅스 배포판의 lilo는 우리가 만든 lilo를 부르고, 불려진 lilo는 우리가 만든 커널을 부르게 될 것입니다. 재부팅을 할 때 여러분은 두 개의 lilo 프롬프트를 볼 것입니다.

간단히 정리하면, QuickInst가 여러분께 어디에 부트 섹터를 위치할 것인지 물어보면, 여러분의 /dev/hda2와 같이 대상 파일시스템이 있는 디바이스를 지정하십시오.

이제 여러분의 시스템의 lilo.conf를 아래와 같은 줄을 가지도록 고치십시오.

other = /dev/hda2
	label = target

Lilo를 실행하면 우리는 대상 시스템으로 첫 부트를 할 수 있게 됩니다.

Glibc

다음으로 우리는 init를 설치해야 하겠지만, 리눅스에서 실행되는 거의 모든 다른 프로그램과 같이, init는 GNU C 라이브러리인 glibc에서 제공하는 라이브러리 함수들을 사용합니다. 그러니 우리는 glibc를 먼저 설치하도록 합시다.

Glibc는 매우 크고 복잡한 꾸러미입니다. 8메가 바이트의 램이 장착된 저의 오래된 386sx/16 컴퓨터로는 설치하는 데 90시간 정도가 걸렸습니다. 하지만 64메가바이트의 메모리가 있는 저의 셀러론 433 컴퓨터로는 33분밖에 걸리지 않았습니다. 제 생각에는 얼마나 시간이 걸리는지는 메모리가 주로 결정하는 것 같습니다. 만약 여러분이 8메가바이트(나, 공포스럽게도 더 작은 크기)의 메모리를 가지고 있었다면 더 많은 설치 시간 걸릴 테니 준비를 하시기 바랍니다.

Glibc 설치 문서는 glibc를 독립된 디렉토리에 설치할 것을 권하고 있습니다. 이렇게 하면 여러분은 단지 그 디렉토리를 지우는 것만으로, 쉽게 재시작할 수 있습니다. 또한 이렇게 하면 265메가바이트 정도의 메모리가 절약됩니다.

평소처럼 glibc-2.1.3.tar.gz(나 다른 버전의) 타르볼을 /mnt/target/usr/src에 풉니다. 이제, 우리는 glibc의 디렉토리에서 애드온들(add-ons)의 압축도 풀 것입니다. 그러니 cd glibc-2.1.3하시고, glibc-crypt-2.1.3.tar.gzglibc-linuxthreads-2.1.3.tar.gz 타르볼을 그곳에 푸십시오.

이제 우리는 설치 디렉토리를 만들고, 설정한 뒤, glibc를 만들고(make) 설치(install)할 것입니다. 저는 아래와 같이 입력했지만, 문서들을 스스로 읽으시고 여러분의 상황에 가장 적합하게 입력하십시오. 한편, 여러분은 glibc를 설치하기 전에 df명령어를 통해서 여유 공간이 얼마나 있나를 볼 수 있습니다. Glibc를 설치한 뒤, 어디에서 용량이 낭비되었는지 보기 위해서 df를 다시 하실 수도 있습니다.

	cd ..
 	mkdir glibc-build
 	../glibc-2.1.3/configure --enable-add-ons --prefix=/usr
 	make
	make install_root=/mnt/target install

우리가 꾸러미를 어디에 설치할지 설정하는 또 다른 방법이 있다는 점에 주의하십시오.

SysVinit

SysVinit 바이너리를 만들고 설치하는 것은 매우 단순합니다. src/ 서브 디렉토리의 Makefile을 조금 해킹해 주어야 합니다. 마지막 네 줄에서, 여러분은 /dev/initctl 바로 앞에 $(ROOT)를 추가해 주셔야 합니다. 예를 들어

	@ if [ ! -p /dev/initctl ]; then \

	@ if [ ! -p $(ROOT)/dev/initctl ]; then \

이 됩니다.

initctl 디바이스 파일은 init와의 통신 수단 중의 하나입니다. 예를 들어 init 맨 페이지를 보면, 주 전원이 끊기려고 하여 UPS 전원에서 동작하고 있을 때 SIGPWR 대신 이 파일을 써서 init를 종료하도록 하고 있습니다. 방금 우리가 한 해킹은 대상 시스템을 위한 것이며, 바탕 시스템에는 영향을 주지 않습니다.

이것이 끝났으면, src 서브디렉토리에서 다음 명령들을 입력하십시오.

	make
	ROOT=/mnt/target make install

init와 관련된 스크립트들은 매우 많습니다. SysVinit 꾸러미 안에 잘 동작하는 예제 스크립트들이 있습니다. 하지만 여러분은 스크립트들을 수동으로 설치해야 할 것입니다. 그것들은 SysVinit 소스 트리 안의 debian/etc 아래의 계층에 있습니다. 여러분은 cd ../debian/etc; cp -r * /mnt/target/etc와 같은 방법으로 스크립트들을 대상의 etc 디렉토리로 직접 복사하시면 됩니다. 여러분은 복사하시기 전에 스크립트들의 내용을 보고 싶으실 것입니다!

재부팅을 할 때 init을 읽어들이기 위한 위한 준비가 대상 커널에 대해서 완전히 끝났습니다. 지금 문제는 bash가 없기 때문에 스크립트가 실행되지 않을 것이라는 것입니다. 또한, initgetty를 실행시키려고 하지만, 실행시킬 getty가 없습니다. 재부팅을 해 보시고 잘못된 것이 없다는 것을 확인하세요.

Ncurses

우리가 다음으로 필요를 하는 것은 Bash이지만, bash는 ncurses를 필요로 하기 때문에 이것을 먼저 설치합니다. Ncurses는 텍스트 스크린을 다루는 수단으로서 termcap을 대체하였지만, tercap의 콜(call)들을 지원함으로써 오래된 프로그램과의 호환성(backwards compatibility)을 지원합니다. 깨끗하고 단순한 현대적인 시스템을 만들기 위해서는, 구식인 termcap 메소드(method)를 끄는 것이 가장 좋을 것이라고 생각합니다. 여러분은 나중에 termcap을 쓰는 구식인 어플리케이션을 컴파일할 때 문제에 직면하게 될지도 모릅니다. 하지만 최소한 여러분은 무엇이 무엇을 쓰는지는 알 것입니다. 만약 필요하다면 termcap을 지원하도록 ncurses를 다시 컴파일 할 수 있을 것입니다.

제가 사용한 명령어는 아래와 같습니다.

	./configure --prefix=/usr --with-install-prefix=/mnt/target --with-shared --disable-termcap
	make
	make install

Bash

Bash를 설치하는 데에는 제가 생각했던 것보다 더 많은 읽기와 생각과 시행착오가 필요했습니다. 제가 사용한 설정 옵션들은 아래와 같습니다.

	./configure --prefix=/mnt/target/usr/local --exec-prefix=/mnt/target --with-curses

일단 여러분이 Bash를 만들고 설치하셨다면, cd /mnt/target/bin; ln -s bash sh와 같은 방법으로 심볼릭 링크를 만드십시오. 많은 스크립트들이 아래와 같은 줄로 시작하기 때문입니다.

#!/bin/sh

심볼릭 링크가 없다면 이러한 스크립트들은 /bin/bash가 아닌/bin/sh를 찾기 때문에 실행될 수 없을 것입니다.

여러분이 재부팅을 하시고 싶다면 지금 하실 수 있습니다. 이제는 스크립트가 실제로 실행되지만, gettylogin 프로그램이 없기 때문에 로그인은 하실 수 없다는 것에 주의하십시오.

Util-linux (getty와login)

Util-linux 꾸러미는 agettylogin을 포함합니다. 우리가 로그인 하고 배시 프롬프트를 받기 위해서는 둘 다가 필요합니다. 이것이 설치된 뒤에는 대상의 /sbin 디렉토리에서 agetty에서 getty로의 심볼릭 링크를 만드십시오. 모든 유닉스 계열의 시스템에서는 getty가 설치되었다고 가정하기 때문에, agetty를 실행시키기 위해 inittab을 해킹하는 것보다 심볼링 링크를 만드는 것이 더 낫습니다.

Util-linux를 컴파일하는 데 있어 문제가 하나 남았습니다. 이 꾸러미는 more을 포함하지만, 저는 make 과정에서 more를 바탕 시스템의 ncurses 4 대신 ncurses 5로 링크하도록 할 수 없었습니다. 저는 그것에 대해 더 자세히 알아 볼 것입니다.

대상 시스템에는 /etc/passwd파일이 있어야 할 것입니다. login 프로그램은 이 파일을 이용하여 여러분이 허용된 사용자인지를 확인할 것입니다. 현 단계에서 시스템은 장난감 상태이기 때문에 우리는 패스워드 없이 루트 유저만을 설치하는 엄청난 일을 할 수 있습니다!! 대상의 /etc/passwd에 아래를 입력하세요.

root::0:0:root:/root:/bin/bash

항목들은 콜론들로 구분되어 있으며, 왼쪽부터 차례대로 사용자 ID, (암호화된)비밀번호, 사용자 번호, 그룹 번호, 사용자의 이름, 홈 디렉토리, 기본 셸입니다.

Sh-utils

우리가 필요로 하는 마지막 꾸러미는 GNU sh-utils입니다. 여기서 우리가 필요한 것은 /etc/init.d/rc에서 쓰이는 stty 뿐입니다. /etc/init.d/rc는 런레벨들(runlevels)을 변경하고, 초기 런레벨로 진입하는 데 쓰입니다. 사실 저는 stty만을 포함하고 있는 꾸러미를 가지고서 사용하였지만, 어디에서 구했는지 기억할 수 없었습니다. 여러분이 시스템을 편하게 사용하시기 위해 필요로 할 다른 프로그램들도 포함되어 있기 때문에, GNU 꾸러미를 사용하는 것이 바람직합니다.

자 끝났습니다. 여러분은 이제 부팅하고 로그인을 위한 프롬프트를 여러분에게 출력해 줄 시스템을 가지게 되었습니다. 여러분은 이것을 가지고 많은 일은 하지 못할 것입니다. 여기에는 여러분의 결과물을 보여줄 ls 명령어조차 없습니다. 탭(tab)키를 두번 누르시면 가능한 명령어들을 볼 수 있을 것입니다. 이것이 제가 해본 것 중에서는 가장 만족스러운 것입니다.

편리한 사용을 위해서

우리가 거의 쓸모없는 시스템을 만들었다고 생각될 수도 있습니다. 하지만 실제로는 이 시스템이 무언가 하도록 하기 위해 해야 할 일이 많지는 않습니다. 여러분이 가장 먼저 해야 할 일 중의 하나는 루트 파일 시스템을 읽기-쓰기로 마운트하는 것입니다. SysVinit 꾸러미 안에는 이와 같은 일을 하고 mount -a를 실행하여 여러분이 /etc/fstab에 써 놓은 대로 파일시스템을 마운트하는 /etc/init.d/mountall.sh라는 스크립트가 있습니다. etc/rc2.d안에 S05mountall과 같은 심볼릭 링크를 넣으십시오.

이 스크립트는 여러분이 아직 설치하지 않은 명령들을 사용할 수도 있습니다. 그렇다면 그 명령을 포함하는 꾸러미를 찾아서 설치하십시오. 잡다한 팁들에 어떻게 꾸러미들을 찾는지에 관한 도움말이 있습니다.

/etc/init.d의 다른 스크립트들도 보십시오. 그들 대부분은 대부분의 진짜 시스템에는 포함되어 있어야 합니다. 그들을 하나씩 설치해 보십시오. 설치하기 전에 모든 것이 잘 돌아간다는 것을 확인하십시오.

파일 계층 표준에 대해 알아보십시오. (파일시스템을 보십시오.) 이것은 /bin/sbin에 있어야 할 명령어들의 목록을 제공합니다. 모든 명령어들이 설치되었는지 확인하십시오. 이것을 규정한 POSIX 문서를 찾아 보시면 더 좋을 것입니다.

여기서부터는 여러분이 필요한 것이 있는 꾸러미를 계속 설치하시면 됩니다. gccmake 같은 설치 도구들을 설치하는 것은 빠를수록 좋습니다. 이들이 설치되면, 여러분은 대상 시스템에서 스스로를 설치할 수 있을 것입니다. 이는 바탕 시스템에서 하는 것보다 덜 복잡합니다.

추가 정보

잡다한 팁들

만약 여러분이 RPM을 지원하는 리눅스 시스템에서 thingy라는 명령이 있고, 이 명령을 얻을 수 있는 소스를 알고 싶으시다면 아래의 명령을 쓰시기 바랍니다.

	rpm -qif `which thingy`

여러분이 래드햇 CD를 가지고 있다면, 여러분은 아래의 코드를 이용하여 소스 코드를 설치할 수 있습니다.

	rpm -i /mnt/cdrom/SRPMS/what.it.just.said-1.2.srpm

이것은 타르볼과 래드햇의 패치들을 /usr/src/redhat/SOURCES에 풀어 놓을 것입니다.

링크

이 문서에 대해서

저작권

This document is copyright (c) 1999, 2000 Greg O'Keefe. You are welcome to use, copy, distribute or modify it, without charge, under the terms of the GNU General Public Licence. Please acknowledge me if you use all or part of this in another document.

홈페이지

이 문서의 최신판은 From Powerup To Bash Prompt에 있습니다.

피드백

저는 여러분의 어떠한 조언이나 비평, 개선을 위한 제안도 듣고 싶습니다. 그것들을 저, Greg O'Keefe에게 보내십시오.

감사

제품 이름들은 각각의 소유자의 상표이며, 여기에서 감사를 드립니다.

이 문서를 쓸 수 있도록 도와주신 데 대해 아래의 분들께 감사를 드리고 싶습니다.

Michael Emery
Unios를 알려 주셨습니다.
Tim Little
/etc/passwd에 대해 도움을 주셨습니다.
efnet의 #linux에 계신 sPaKr
syslogd는 /etc/services를 필요로 한다는 것을 알려주셨고, 시스템을 소스 코드로 설치하는 것을 묘사하기 위한 여러분의 것을 돌린다(rolling your own)는 표현을 소개해 주셨습니다.
Alex Aitkin
저에게 Vico와 그의 verum ipsum factum(understanding arises through making, 이해는 만듦에서 기원한다)을 저에게 소개해 주셨습니다.
Dennis Scott
저의 16진수 계산을 고쳐 주셨습니다.
jdd
오자들을 지적해 주셨습니다.

변경 기록

0.8 → 0.9

0.8

할 일