8. 루트 파일시스템의 크기를 줄이는 방법

부트디스크를 만들 때 중요한 문제중의 하나는 모든 것을 하나의(혹은 두개의) 디스켓에 다 집어넣어야 한다는 것입니다. 리눅스 시스템 자체의 크기도 점점 커져가는 추세라 파일들을 압축하더라도 한장에 다 넣기는 매우 어렵습니다. 다음은 제한된 용량의 플로피디스켓 속에 다 집어넣기 위한 일반적인 방법들입니다.

8.1. 디스크의 밀도를 높입니다

디폴트 값으로 플로피 디스켓은 1440 K 로 포맷됩니다, 하지만 더 높은 밀도의 포맷도 가능합니다. 밀도를 더 높여 포맷했을 때 그 디스켓으로 부팅할수 있는지 여부는 대부분의 경우 BIOS 에 달려있습니다. fdformat 명령어는 디스크를 다음과 같은 크기로 포맷할 수 있습니다: 1600, 1680, 1722, 1743, 1760, 1840, 1920. fdformat 의 맨페이지와 /usr/src/linux/Documentation/devices.txt 를 참조하십시오.

그렇다면 당신 컴퓨터는 어떤 디스켓 밀도 및 지오메트리를 지원할까요? 다음은 fdutils 프로그램의 저자인 Alain Knaff 씨로부터의 답변입니다(약간 편집하였습니다).

이것은 디스켓의 물리적 포맷의 문제라기보다는 오히려 BIOS 에 관련된 문제라 할수 있습니다. 만약 BIOS 가 18 을 초과하는 섹터넘버를 에러(bad)로 간주해버린다면 더이상 우리가 할수 있는 일은 별로 없습니다. BIOS 를 디스어셈블링한 자료가 부족하기 때문에 이는 시행착오를 통해 확인할 수 밖에 없습니다. 하지만, 만일 BIOS 가 ED 디스크(extra density: 36 sectors/track, 2.88MB)를 지원하는 경우에는, 1722K 디스크도 같이 지원될 가능성이 있습니다.

트랙당 섹터수가 21 섹터를 초과해 수퍼포멧된 디스크는 부팅이 안되기 쉽습니다: 사실, 이러한 디스크들은 비표준 사이즈(예를 들면, 표준인 섹터당 512 바이트 대신 1024 바이트를 할당하는 것)의 섹터를 사용하기 때문에 부팅에 실패하기 쉽습니다. 하지만 이를 위해 특별한 부트섹터 프로그램을 작성한다면 문제를 해결할 수 있습니다. 제 기억이 맞다면, DOS 2m 유틸리티에 이런 기능이 있고, OS/2 의 XDF 유틸리티에도 이런 기능이 있습니다.

일부 BIOS 들은 18 을 초과하는 섹터넘버는 무조건 에러로 간주해 버립니다. 1722 K 디스크는 21 섹터까지 사용하기 때문에 이런 BIOS 하에서는 부팅되지 않을 것입니다. 이를 확인하는 가장 확실한 테스트 방법은 DOS 나 syslinux 디스켓을 1722 K 로 포맷한 후 부팅가능하게 만들어, 이것으로 부팅해 보는 것입니다. 만일 그대신 LILO 를 사용해 보겠다면 linear 옵션을 주어서는 안됩니다(linear 옵션을 주면 LILO 는 그 디스켓을 표준 18 sectors/track 디스켓으로 간주해버리기 때문에 BIOS 가 고밀도 디스켓을 지원함에도 불구하고 부팅에 실패할 것입니다).

8.2. 일반적인 유틸리티들을 BusyBox 로 대체합니다

루트 파일시스템이 가지는 공간의 상당부분은 cat, chmod, cp, dd, df 등등의 보통의 GNU 시스템 유틸리티들이 차지합니다. BusyBox 프로젝트는 이러한 보통의 시스템 유틸리티들을 최소크기의 것들로 대치하려는 프로젝트입니다. BusyBox 는 한덩어리의 큰 실행화일인 /bin/busybox 를 제공합니다. 그 크기는 약 150 K 로서 보통의 유틸리티들의 기능들을 모두 수행합니다. 이상태에서 각각의 유틸리티들을 이 실행화일과 심볼릭 링크해주면 busybox 는 자신이 호출된 상황에 따라 알맞은 코드를 호출하게 됩니다. 심지어 BusyBox 는 기본 쉘조차 포함하고 있습니다. BusyBox 는 많은 배포본들용으로 바이너리 패키지가 나와있습니다. 소스코드는 the BusyBox site 에서 찾을수 있습니다.

8.3. 쉘을 바꿉니다

리눅스에서 인기 있는 쉘은 bash, tcsh 등등이 있지만 이것들은 크기도 크고 많은 라이브러리들을 필요로 합니다. BusyBox 쉘 까지는 쓰지 않는다 해도, 다른 쉘로 바꿔보는 것도 고려해볼만 합니다. ash, lsh, kiss, smash 같은 경량급 쉘들은 훨씬 작고 라이브러리를 별로 필요로 하지 않거나 전혀 요구하지 않으므로 대안이 될 수 있습니다. 이러한 대용 쉘들은 대부분 다음 홈페이지에서 찾을 수 있습니다. http://www.ibiblio.org/pub/Linux/system/shells/. 명심할 것은 어떤 쉘을 쓰든 간에 그 쉘은 부트디스크에 포함시킨 rc 파일들 내의 모든 명령어들을 실행시킬 수 있어야 한다는 것입니다.

8.4. 라이브러리와 바이너리들을 스트립(strip)합니다

많은 라이브러리와 바이너리들이 디버깅 정보를 포함한 채 배포됩니다. 이런 파일들에 대해 file 명령을 실행하면 "not stripped" 라는 결과가 출력됩니다. 바이너리들을 루트 파일시스템으로 복사할 때는 다음과 같이 하면 좋습니다.
                objcopy --strip-all FROM TO

중요: 라이브러리를 복사할 때는 strip-all 대신 strip-debug 을 사용하세요.

8.5. 파일들을 유틸리티 디스크로 옮깁니다

부트나 로그인 시에 즉각 필요한 것이 아니라면 그런 바이너리들은 유틸리티 디스크로 옮겨놓을 수 있습니다. 자세한 것은 9.2절 을 보십시오. 모듈들을 유틸리티 디스크로 옮겨놓는 것도 고려해 볼만 합니다.