6.6. 필수 파일 및 Symlink 생성

일부 프로그램은 아직 존재하지 않는 프로그램에 대한 고정 경로를 사용한다. 이러한 프로그램들을 만족시키기 위해, 이 장의 절차를 거치면서 소프트웨어를 설치한 후 실제 파일로 대체될 여러 심볼릭 링크를 만든다:

ln -sv /tools/bin/{bash,cat,chmod,dd,echo,ln,mkdir,pwd,rm,stty,touch} /bin
ln -sv /tools/bin/{env,install,perl,printf}         /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1}                  /usr/lib
ln -sv /tools/lib/libstdc++.{a,so{,.6}}             /usr/lib

ln -sv bash /bin/sh

각 링크의 용도:

/bin/bash

많은 bash 스크립트가 /bin/bash를 지정한다.

/bin/cat

이 경로명은 Glibc의 configure 스크립트에 하드 코딩되어 있다.

/bin/dd

dd의 경로는 /usr/bin/libtool 유틸리티에 하드 코딩될 것이다.

/bin/echo

/bin/echo를 참조하는 Glibc의 테스트 스위트 내 테스트 중 하나를 만족시키기 위함이다.

/usr/bin/env

이 경로명은 일부 패키지 빌드 절차에 하드 코딩되어 있다.

/usr/bin/install

install의 경로가 /usr/lib/bash/Makefile.inc 파일로 하드 코딩될 것이다.

/bin/ln

ln의 경로는 /usr/lib/perl5/5.30.1/<target-triplet>/Config_heavy.pl 파일에 하드 코딩된다.

/bin/pwd

일부 configure 스크립트, 특히 Glibc의 것에는 이 경로명이 하드 코딩되어 있다.

/bin/rm

rm의 경로는 /usr/lib/perl5/5.30.1/<target-triplet>/Config_heavy.pl 파일에 하드 코딩된다.

/bin/stty

이 경로명은 Expect로 하드 코딩되어 있어서, Binutils와 GCC 테스트 스위트 통과에 필요하다.

/usr/bin/perl

많은 Perl 스크립트가 perl 프로그램에 대해 이 경로를 하드 코딩한다.

/usr/lib/libgcc_s.so{,.1}

Glibc의 pthreads 라이브러리가 작동하기 위해 필요하다.

/usr/lib/libstdc++{,.6}

GMP의 C++ 지원과 더불어 Glibc의 테스트 스위트에서 몇 가지 테스트를 하기 위해 필요하다.

/bin/sh

많은 셸 스크립트가 /bin/sh를 하드 코딩한다.

역사적으로 리눅스는 마운팅된 파일 시스템 목록을 /etc/mtab 파일로 관리한다. 최신 커널은 이 목록을 내부적으로 관리하며 /proc 파일 시스템을 통해 사용자에게 공개한다. /etc/mtab이 존재할 것으로 예상하는 유틸리티들을 만족시키기 위해, 다음 심볼릭 링크를 생성하라:

ln -sv /proc/self/mounts /etc/mtab

root 유저가 로그인할 수 있게 하고 root 이름이 인식되게 하려면 /etc/passwd/etc/group 파일에 관련 항목이 있어야 한다.

다음 명령을 실행하여 /etc/passwd 파일을 생성하라:

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF

root에 대한 실제 암호(여기서 사용되는 x는 구문표시자일 뿐이다)는 나중에 설정된다.

다음 명령을 실행하여 /etc/group 파일을 생성하라:

cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
wheel:x:97:
nogroup:x:99:
users:x:999:
EOF

생성된 그룹들은 어떤 표준에도 속하지 않는다—부분적으로는 이 장의 Udev 구성의 요구사항에 의해, 부분적으로는 기존 리눅스 배포판에 사용된 공통 규약에 의해 만들어진 그룹이다. 그리고 일부 테스트 스위트들은 특정 유저나 그룹을 필요로 한다. 리눅스 기본 규격(Linux Standard Base, LSB, http://www.linuxbase.org에서 참고)은 그룹 ID (GID) 0인 root 그룹 외에, GID가 1인 bin 그룹도 존재하게 둘 것을 권장한다. 다른 모든 그룹명과 GID는 잘 작성된 프로그램이라면 GID 번호에 의존하지 않고 그룹명을 사용하기 때문에 시스템 관리자가 자유롭게 정할 수 있다.

I have no name! 프롬프트를 지우려면 새 셸을 시작하라. 5장에서 완전한 Glibc가 설치되었고 /etc/passwd/etc/group 파일이 생성되었으므로 이제 유저명과 그룹명을 잘 불러올 것이다:

exec /tools/bin/bash --login +h

+h 지시문의 사용에 주목하라. 이것은 bash의 내부 경로 해싱을 비활성화 한다. 이 명령이 없으면 bash는 바이너리를 실행한 경로를 기억할 것이다. 새로 컴파일된 바이너리 파일이 설치되는 즉시 사용될 수 있도록 이 장에서는 +h 지시문을 사용할 것이다.

login, agettyinit 프로그램(및 기타)은 누가, 언제 시스템에 로그인했는지 같은 정보를 기록하기 위해 여러 로그 파일을 사용한다. 그러나 이런 프로그램들은 로그 파일이 이미 존재하지 않으면 로그를 남기지 않는다. 로그 파일을 초기화하고 적절한 권한을 부여하라:

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

/var/log/wtmp 파일은 모든 로그인과 로그아웃을 기록한다. /var/log/lastlog 파일은 각 유저가 마지막으로 로그인한 시간을 기록한다. /var/log/faillog 파일은 유저의 로그인 실패 정보를 기록한다. /var/log/btmp 파일은 잘못된 로그인 시도를 기록한다.

[참고]

참고

/run/utmp 파일은 현재 로그인한 유저를 기록한다. 이 파일은 부팅 스크립트에서 동적으로 생성된다.