You cannot see this page without javascript.

LFS/Bootscripts - 시스템 부트로더 설정하기

Linux 조회 수 570 추천 수 0 2014.08.06 10:31:00

1. 일반적인 네트워크 설정

 
이번 절에서는 네트워크 카드가 설정되도록 할 것입니다.
 
만약 네트워크 카드를 사용하지 않을 것이라면 관련된 설정파일을 만들 필요가 없습니다. 이런 경우에 여러분은 LFS-Bootscripts-20120901에서 부트 스크립트를 설치한 후 모든 run-level 디렉토리(/etc/rc.d/rc*.d)에 있는 network symlink를 지우십시오.
 
 

1.1. 네트워크 인터페이스를 위한 이름 만들기

만약 단 한개의 네트워크 인터페이스만 시스템에서 설정되어야 한다면 절대로 잘못될 일이 없습니다. 많은 경우에(무선과 유선을 사용하는 노트북의 경우) 이번 절에서 반드시 네트워크 설정을 해주어야 합니다.
 
Udev와 모듈화된 드라이버들로 네트워크에 숫자를 매기는 것은 기본값에 의한 것이기 때문에 지속적인 것이 아닙니다. 왜냐하면 드라이버는 평행하게 로드되기 때문인데 이 때 로드 순서는 랜덤으로 지정됩니다. 예를 들어 컴퓨터가 Intel과 Realtek에서 만들어진 두개의 네트워크 카드를 가지고 있다 칩시다. 이 때 네트워크 카드는 Intel이 eth0, Realteck 카드가 eth1으로 되었습니다. 하지만 재부팅할 경우에, 이 순서가 바뀔수도 있습니다. 이를 피하기 위해서 Udev를 이용해서 약간의 규칙을 정하여 스크립트로 만들어주면 MAC 어드레스 기반의 네트워크 카드에 따라 일정한 이름을 지정해줄 수 있습니다.
 
규칙은 지난 장에서 udev를 설치할 때 미리 만들어집니다. /etc/udev/rules.d/70-persistent-net.rules 파일을 살펴보십시오. 네트워크 장비가 어떻게 이름이 정해지는지 알 수 있을 겁니다.
cat /etc/udev/rules.d/70-persistent-net.rules
 
Note

MAC 어드레스를 네트워크 카드에 지정했다거나 Xen과 같은 가상 환경에서는 network 규칙이 만들어지지 않았을 수도 있습니다. 왜냐하면 주소들이 일정하게 나오지 않기 때문입니다. 이러한 경우에는 다음 절을 살펴보시기 바랍니다.
 
파일은 각 NIC에 대한 두개의 라인으로된 코멘트 부분으로 시작됩니다. 각 NIC에 대한 첫번째 라인은 만약 드라이버가 검색되었다면 해당 하드웨어의 ID(e.g. PCI vendor, device IDs)에 대한 기술정보가 보일 것입니다. 하지만 hardware ID나 드라이버가 인터페이스의 이름을 결정하는데 사용되지 않는다면 사용할 수 있는 정보는 오직 레퍼런스 뿐입니다. 두번째 라인은 Udev 규칙으로 NIC와 부합되어 해당 카드에 이름을 부여합니다.
 
모든 Udev 규칙들은 몇개의 key를 가지고 있는데 이 key는 콤마와 빈 공간으로 구별됩니다. 규칙에 사용되는 각 key와 설명은 다음과 같습니다:
  • SUBSYSTEM=="net": 이것은 Udev가 network card가 아닌 장치는 무시하게 만듭니다.
  • ACTION=="add": Udev가 새로 추가된 장치라는 이벤트가 발생하지 않은 장치는 무시하도록 만듭니다.("remove"와 "change"또한 이번트가 일어나고 규칙을 세울 수 있지만 network card에는 적용시킬 수 없습니다.)
  • DRIVERS=="?*": 이것은 이미 존재하는 VLAN이나 bridge sub-interface들을 무시하도록 만듭니다.
  • ATTR{address}: key의 값으로 NIC의 맥 어드레스를 가리킵니다.
  • ATTR{type}=="1": 두 개 이상의 가상 인터페이스를 제공하는 특정 무선 드라이버에 대해서 주 인터페이스만 사용하도록 합니다.
  • KERNEL=="eth*": 이 키는 Udev 규칙이 여러개의 네트워크 인터페이스를 만들어 낼 때 이들을 basename으로 가려내기 힘든 경우 따로따로 구별하기 위해 사용됩니다. 이것은 일반적으로 LFS 사용자에게는 필요하지는 않지만 나쁠 건 없습니다.
  • NAME: Udev가 인터페이스에 적용시키는 이름값을 나타냅니다.
     

1.2. 네트워크 인터페이스 설정 파일 만들기

네트워크 인터페이스는 /etc/sysconfig/에 있는 스크립트에 의해 켜지거나 꺼집니다. 이 디렉토리는 반드시 ifconfig.xyz(xyz는 eth0와 같은 장치이름입니다)와 같이 각 인터페이스에 대해 설정한 파일을 가지고 있어야 합니다. 파일 안에는 IP 주소나 서브넷 마스크 같은 인터페이스에 대한 어트리뷰트를 포함하고 있습니다.
 
다음과 같이 eth0 장치에 대한 간단한 파일을 만들어줍니다.
cd /etc/sysconfig/
cat > ifconfig.eth0 << "EOF"
ONBOOT=yes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
 
위의 변수들의 값은 적절한 설정을 위해 반드시 바뀌어야 합니다.
 
만약 ONBOOT 변수값이 "yes"로 설정되어 있다면 네트워크 스크립트는 Network Interface Card(NIC)의 상태를 시스템이 부팅될 때 킬 것입니다. 만약 인터페이스를 직접 시작하거나 끄고 싶다면 ifupifdown 명령어로 할 수 있습니다.
 
IFACE 변수는 인터페이스의 이름을 정합니다.(예: eth0) 이것은 모든 네트워크 장비에 대해 설정해 주어야 합니다.
 
SERVICE 변수는 연결시 얻어오는 IP 주소를 설정합니다. LFS-Bootscripts 패키지는 모듈화된 IP 할당 형식이며 /lib/services/ 디렉토리 안에 추가적인 파일들을 만들어서 IP 할당 메서드를 다른 사용자에게도 허용합니다. 이것은 공통적으로 Dynamic Host Configuration Protocol(DHCP)에서 사용되며 이것은 BLFS 책에 담겨 있습니다.
 
GATEWAY 변수는 기본 게이트웨이 IP 주소를 포함하고 있어야 합니다. 만약 그렇지 않다면 전체적으로 변수들을 comment out하여 사용하지 말아야 합니다.
 
PREFIX 변수는 서브넷으로 사용할 비트의 숫자를 담고 있습니다. 각 IP 주소의 바이트는 8비트입니다. 만약 서브넷 넷마스크가 255.255.255.0이라면 3개의 바이트(24bits)를 사용하고 있는 것입니다. 만약 넷마스크가 255.255.255.240이라면 처음 28비트를 사용하고 있는 것이겠죠. 24bit보다 더 긴 Prefix는 공통적으로 DSL과 cable-based Internet Service Providers(ISPs)에 의해 사용됩니다. 이러한 예에서는 PREFIX=24로 설정하고 넷마스크는 255.255.255.0이 됩니다. 여러분들의 특정 서브넷에 맞게 설정하십시오. 만약 생략하게 되면 기본값은 24입니다.
 
 

1.3. /etc/resolv.conf 파일 만들기

만약 시스템이 인터넷에 연결하려고 한다면 인터넷 도메인 이름을 IP 주소로 바꿔주는 DNS(Domain Name Service) 서비스가 필요합니다. ISP나 네트워크 관리자가 사용가능하도록 /etc/resolv.conf파일안에 DNS 서버의 IP 주소를 저장합니다.
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf

domain <Your Domain Name>
nameserver <IP address of your primary nameserver>
nameserver <IP address of your secondary nameserver>

# End /etc/resolv.conf
EOF
 
도메인 상태는 생략되거나 검색하는 상태로 둘 수 있습니다. 더 자세한 것은 resolv.conf의 맨페이지를 참고하세요.
 
<IP address of nameserver>로 된 부분을 이러분에게 적합한 DNS의 IP 주소로 바꿉니다. 만약 DNS 서버로 하나만 사용하길 원한다면 두번째 네임서버를 삭제하면 됩니다.

2. /etc/hosts 파일 설정하기

만약 네트워크 카드가 설정이 완료되었다면 IP 주소와 fully-qualified domain name(FQDN), /etc/host 파일 안에 가능한 aliases를 결정해야 합니다.
IP_address myhost.example.org aliases
 
비록 컴퓨터가 IP를 할당받아서 인터넷을 접속할 수 있다고 해도 private network IP 주소의 범위를 확실하게 설정해 주십시오:
Private Network Address Range    Normal Prefix
10.0.0.1 - 10.255.255.254         8
172.x.0.1 - 172.x.255.254         16
192.168.y.1 - 192.168.y.254       24
 
x는 16-31사이의 숫자가 될 겁니다. y는 0-255사이의 숫자가 될것입니다.
 
유효한 사설 IP 주소로 192.168.1.1이 가능합니다. FQDN으로는 lfs.example.org등이 유효한 IP입니다.
 
네트워크 카드를 사용하지 않는다고 해도 FQDN은 필요합니다. 이것은 특정 프로그램들이 정상적으로 작동하기 위해 필요한 것들입니다.
 
/etc/hosts 파일을 만들어 줍니다.
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)

127.0.0.1 localhost
<192.168.1.1> <HOSTNAME.example.org> [alias1] [alias2 ...]

# End /etc/hosts (network card version)
EOF
 
<192.168.1.1>과 <HOSTNAME.example.org> 값은 특별한 사용과 요구들을 위해 변경되어야 합니다.(만약 네트워크나 시스템 관리자에 의해 IP 주소가 되었다면 시스템은 기존 네트워크에 연결되려고 할 것입니다. alias name(s) 옵션은 생략될 수 있습니다.
 
네트워크 카드를 설정하지 않는다면 다음과 같이 /etc/hosts파일을 만드십시오:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (no network card version)

127.0.0.1 <HOSTNAME.example.org> <HOSTNAME> localhost

# End /etc/hosts (no network card version)
EOF

3. LFS 시스템에서 장치와 모듈 핸들링하기

이전 장에서 우리는 Udev 패키지를 설치했습니다. 이것의 작동 원리에 대해 자세히 알기 전에 그동안 어떻게 장치들을 핸들리해왔는지에 대해 간단하게 설명하겠습니다.
 
리눅스 시스템은 static device creation 이라는 방법을 사용했었습니다. 이 방법은 /dev/ (때때로 문자그대로 천개정도의 노드가 있었습니다) 디렉토리 안에 엄청나게 많은 디바이스 노드를 가지고 있었습니다. 해당 노드에 맞는 하드웨어가 실제로 존재하지도 않는데도 말이죠. 이것은 전형적으로 MAKEDEV 라는 스크립트에 의해 이루어졌으며 이 스크립트는 모든 가능한 장치의 숫자들을 mknod 프로그램으로 전하는 부분을 가지고 있었습니다.
 
Udev 방법을 이용하므로써, 커널에 의해 탐색된 디바이스에 대한 노드들만 만들어지게 됐습니다. 이러한 디바이스 노드들은 시스템이 부팅될 때마다 만들어지고 devtmps라는 파일시스템에 저장됩니다. 디바이스 노드들은 많은 용량을 차지하지 않아서 무시해도 될 정도입니다.
 
 

3.1. 변화된 과정

2000년 2월, devfs라는 새로운 파일시스템이 2.3.46 커널에서 출현하여 2.4 stable 커널 시리즈부터 사용 가능하게 되었습니다. 커널 소스로 나왔지만 디바이스를 동적으로 만드는 방법은 핵심 커널 개발자들에게는 정말로 큰 혁명과도 같은 것이었습니다.
 
devfs를 적용하여 접근하는 방법의 주요 문제는 어떻게 장치를 감지하고 생성하고 이름을 지을 것인가에 대한 것이었습니다. 디바이스의 이름을 짓는 문제는 아마도 중요한 문제였을 것입니다. 그당시에 일반적으로 장치의 이름을 설정한다고 하면 이것은 시스템 관리자가 할 수 있는 일이었고 다른 개발자는 감히 생각지도 못하는 일이었습니다. devfs파일 시스템은 커널의 디자인에 내재된 것이었기 때문에 상당한 커널의 수정 없이는 바뀔 수 없는 것이었습니다. 이 것은 더이상 사용되지는 않게됐지만 오랜 기간동안 관리의 소홀로 남아있었습니다. devfs는 2006년 6월에 비로소 삭제되었습니다.
 
불안정했던 2.5 커널 트리에서 마침내 새로운 가상 파일 시스템인 sysfs와 함께 2.6 시리즈의 안정된 커널 버전이 릴리즈 되었습니다. sysfs의 작업은 시스템의 하드웨어 설정을 userspace 프로세스들에게 제공하는 것이었습니다. 이렇게 유저공간에서 볼 수 있게 됨으로써 devfs보다 현실적으로 할 수 있는 것들이 많아졌습니다.
 
 

3.2. Udev 구현

 

3.2.1. Sysfs

sysfs파일시스템에 관해서는 앞서 간단하게 설명했습니다. 아마 어떻게 sysfs가 현재 시스템에 어떤 디바이스가 있는지, 그것들을 위해 어떤 디바이스 넘버를 사용해야하는지 아는 것에 대해 궁금하신 분들이 계실 겁니다. 커널에 의해 디바이스가 탐색되면 sysfs의 오브젝트로 커널에 직접 등록되어 컴파일됩니다. 드라이버가 모듈로써 컴파일되면 모듈이 로드되었을때 커널에 등록됩니다. sysfs 파일시스템이 /sys 에 마운트 될때 sysfs로 등록된 buit-in된 드라이버들의 데이터는 userspace 프로세스에서 이용가능하며 udevd가 프로세싱하는데 이용될 수 있습니다.

3.2.2. Udev Bootscripts

/etc/rc.d/init.d/udev initscript는 리눅스가 부팅될 때 디바이스 노드를 만드는 것을 다룹니다. script는 uevent handler로 /sbin/hotplug가 설정되는 것을 해제합니다. 커널이 더이상 추가적인 binary를 부를 필요가 없기 때문입니다. 대신에 udevd가 kernel이 일으키는 uevents를 netlink 소켓을 통하여 감지합니다. 다음에는 bootscript가 어떠한 노드이건 간에 /lib/udev/devices에 있는 정적 디바이스 노드를 /dev 안으로 복사합니다. 이것은 디바이스, 디렉토리, 심링크들이 시스템이 부팅되는 단계에서 동적으로 장치를 핸들링하는 프로세스에 의해 요구되거나 udevd에 의해 요구되기 때문에 꼭 필요합니다. 정적 디바이스 노드를 /lib/udev/devices 안에 생성하는 것은 또한 장치들을 관리하기에 편합니다. 이 후 bootscript는 Udev 데몬(udevd)데몬을 실ㅤㅎㅛㅇ시켜 uevents를 받아 처리할 수 있게끔 만읍니다. 마지막으로 bootscript는 커널이 udevd가 장치로부터 오는 이벤트를 처리할 때까지 강제로 기다리게 합니다.
 
/etc/rc.d/init.d/udev_retry initscript는 아직 mountfs 스크립트가 실행될 때까지 파일시스템을 마운트하지 못한 서브시스템(/usr이나 /var에서 발생됨)에서 발생하는 이벤트를 다시 실행하는 것을 다룹니다. 이 스크립트는 mountfs스크립트 이후에 실행되며 이러한 규칙은 두번에 성공할 겁니다. /etc/sysconfig/udev_retry 파일로 설정되며 이 파일에 있는 코멘트를 제외한 모든것들이 서브시스템의 이름과 retry time을 설정합니다.

3.2.3. 디바이스 노드 생성

최근 udev 버전에서는 udevd는 더이상 /dev 안에 디바이스 파일을 생성하지 않습니다. 대신에 커널에 있는 devtmpfs라는 파일시스템에 의해 핸들링됩니다. 디바이스 노드로 등록되고자 하는 모든 드라이버는 devtmpfs를 통과하게 됩니다. devtmpfs 인스턴스가 /dev에 마운트되면 디바이스 노드는 수정된 이름, 권한, 소유권으로 초기화되어 만들어질 겁니다.
 
얼마 후에 커널이 udevd로 uevent를 보낼 것입니다. /etc/udev/rules.d, /lib/udev/rules.d, /run/udev/rules.d 안에 있는 파일에 의해 정의된 규칙에 기초하여 udevd는 추가적인 device 노드에 대한 심볼릭 링크를 생성하고 권한, 소유권, 그룹 등을 변경하거나 비어있는 udevd 데이터베이스 엔트리를 수정할 것입니다.
 
이러한 세개의 디렉토리에 있는 규칙또한 LFS-Bootscripts 패키지에도 비슷하기 있습니다. 또 이 세개의 디렉토리가 함께 합쳐져 있습니다. 만약 udevd가 디바이스에 대한 규칙을 찾지 못한다면 devtmpfs가 초기화했던 그대로 남겨질 것입니다.

3.2.4. 모듈 로딩

디바이스 드라이버는 alias된 채 모듈로 컴파일 ㅤㄷㅚㅆ수 있습니다. alias는 moidinfo프로그램의 출력으로 확인할 수 있고 모듈에 의해 지원되는 장치는 버스로 명확히 식별가능합니다. 예를 들어서 snd-fm801 드라이버는 PCI 장치로 vendor ID 0x1319와 device ID 0x0801로 지원되고 "pci:v00001319d00000801sv*sd*bc04sc01i*"로 alias 된 상태입니다. 대부분의 장치에서 bus 드라이버는 sysfs를 통해 디바이스를 조작할 수 있도록 드라이버의 alias를 제공합니다. 예로 /sys/bus/pci/devices/0000:00:0d.0/modalias 파일은 문자열 "pci:v00001319d00000801sv00001319sd00001319bc04sc01i00"를 갖고 있습니다. Udev에 의해 제공된 기본적인 규칙은 udevd가 MODALIAS uevent 환경 변수의 내용으로 /sbin/modprobe를 부르도록 만듭니다. 때문에 모든 alias된 모듈들을 문자열과 매칭시켜서 로딩할 수 있습니다.
 
이 예제에서 snd-fm801은 원하지 않더라도 forte 드라이버를 로드할 것입니다. 다음 부분에 이러한 경우에 대한 해결방법을 참고하십시오.
 
커널 스스로 네트워크 프로토콜에 대한 모듈을 로드할 수 있고 파일시스템과 NLS 또한 필요하다면 로드할 수 있습니다.

3.2.5. 제거가능한 장치 동적으로 핸들링하기

여러분이 USB MP3 플레이어같은 디바이스를 꽂았다면 커널은 연결을 감지하고 uevent를 발생시킵니다. 여기서 생겨난 uevent는 udevd에 의해 위에서 언급한 것처럼 핸들링됩니다.

3.2.6. 모듈 로딩과 디바이스 생성의 문제

자동적으로 디바이스 노드를 생성하려고 할 때 발생될 수 있는 몇가지 문제들이 있습니다.

3.2.6.1. 커널 모듈은 자동으로 로드되지 않는다

 
Udev는 alias되어있는 특정 버스나 sysfs에 필수 alias로 등록되어 있는 모듈일 경우에만 자동적으로 로드합니다. 다른 경우에는 다른 방법을 통해서 모듈을 로드해야 합니다. Linux-3.5.2에서 Udev는 INPUT, IDE, PCI, USB, SCSI, SERIO, FireWire 디바이스들을 위해 적절하게 만들어진 드라이버를 로드한다고 알려져 있습니다.
 
여러분이 요구하는 디바이스 드라이버가 Udev에서 지원되는지 확인하려면 해당 모듈 이름과 함께 modinfo를 실행하십시오. /sys/bus 아래에 있는 디바이스 디렉토리로 가서 어떤 modalias파일이 있는지 확인해보십시오.
 
만약 modalias 파일이 sysfs안에 존재한다면 그 드라이버는 해당 장치를 지원하고 장치와 직접적으로 통신한다는 뜻이지만 만약 alias를 가지고 있지 않다면 드라이버에 버그가 있는 것입니다. 이러한 버그들은 나중에 패치될 것입니다.
 
만약 관련된 /sys/bus 디렉토리에 modalias 파일이 없다면 이것은 커널 개발자가 modalias를 아직 추가하지 않았다는 의미입니다. Linux-3.5.2에서는 ISA 버스들이 이 경우에 해당합니다. 커널 버전이 새로 업데이트 되면 추후에 패치될 것입니다.
 
Udev는 snd-pcm-oss같은 "wrapper" 드라이버나 loop같은 하드웨어가 아닌 드라이버는 로드하려 하지 않을 것입니다.

3.2.6.2. 커널 모듈은 자동으로 로드되지 않는데 udev도 이를 로드하려고 하지 않는 경우

만약 "wrapper" 모듈이 다른 모듈에 의해 제공되는 기능을 향상시킬수 있다면 (예를 들어 snd-pcm-oss는 OSS 어플리케이션에서 사운드 카드를 가능하게 만들어 snd-pcm의 기능을 향상시킬 수 있습니다) modprobe를 설정하여 Udev가 wrapped 모듈을 로드한 후 wrapper 모듈을 로드할 수 있게끔 할 수 있습니다. 이를 위해서는 "softdep"라인을 /etc/modprobe.d/<filename>.conf 파일에 추가하면 됩니다.
softdep snd-pcm post: snd-pcm-oss
 
"softdep" 명령어가 pre: 혹은 의존성에 따라 pre:와 post:를 함께 섞어서 사용할 수 있다는 걸 명심하십시오. 자세한 건 modprobe.d(5) 메뉴얼 페이지를 확인하세요.
 
만약 질문에서의 모듈이 wrapper가 아니지만 유용한 것이라면 modules bootscript를 설정하여 시스템이 부팅될 때 로드할 수 있습니다. 이를 위해서는 /etc/sysconfig/modules 파일에 따로 모듈 이름을 추가하십시오.

3.2.6.3. Udev가 원하지 않는 모듈을 로드하는 경우

모듈은 빌드하지 않거나 /etc/modprobe.d/blacklist.conf 파일에 forte 모듈을 추가해주어서 원하지 않는 모듈을 로드하지 않도록 설정할 수 있습니다.
blacklist forte
 
블랙리스트에 등록된 모듈은 수동적으로 modprobe 명령어를 통해 로드될 수 있습니다.

3.2.6.4. Udev가 디바이스를 올바르지 않가 생성하거나 잘못된 symlink를 만드는 경우

일반적으로 Udev 규칙을 잘못 설정한 경우에 문제가 발생합니다. 예를 들어 잘못된 규칙은 SCSI 디스크와 동시에 제조회사에 따라 SCSI generic device도 매치시킵니다. 이 경우에는 더 세부적으로 키값을 사용하여 올바른 규칙을 적용해야 하며 여기에 udevadm info 명령어를 사용할 수 있습니다.

3.2.6.5. Udev가 불완전하게 작동되는 경우

이것은 아마도 이전 문제와는 다른 현상일 겁니다. 만약 아니라면, 여러분의 규칙이 sysfs 어트리뷰트를 사용하고 있다거나 나중에는 수정되겠지만 커널 타이밍 문제때문입니다. 이제 여러분은 /etc/udev/rules.d/10-wait_for_sysfs.rules 파일에 덧붙여서 sysfs 어트리뷰트를 사용할 수 있습니다(만약 파일이 없다면 이 파일을 만드십시오)

3.2.6.6. Udev가 장치를 만들지 않는 경우

제목에서 예상할 수 있듯이 드라이버가 커널에 정적으로 빌드되었거나 이미 모듈로써 로드된경우, 그리고 Udev가 디바이스에 대해 잘못된 이름을 설정하는 경우를 확인한 경우입니다.
 
Udev는 커널 드라이버에서 sysfs를 통해 아무런 정보도 전해주지 않는다면 디바이스 노드를 생성하기 위해 필요한 정보에 대해 가지고 있는 것이 아무것도 없게 됩니다. 이러한 현상들의 공통적인 점은 커널 트리 밖의 제 3의 드라이버가 있다는 점입니다. /lib/udev/devices안에 정적노드를 만드십시오. 그러면 udev bootscript에서 디바이스 노드가 /dev 디렉토리로 복사될 겁니다.

3.2.6.7. 디바이스 네임이 재부팅후에 랜덤으로 바뀌는 경우

이것은 Udev의 설계때문에 일어나는 것인데, uevent와 모듈을 랜덤의 순서에 따라 병렬적으로 핸들링하기 때문입니다. 이것은 절대 고쳐질 수가 없습니다. 만약 여러분이 커널 디바이스 이름에 의존하지 않는다면 절대로 안정적으로 될 수 없습니다. 대신 디바이스의 어트리뷰트를 이용해서 적절한 규칙을 세워서 symlink를 만드는 방법이 있습니다. 이 경우에 사용되는 어트리뷰트로는 serial number나 다양한 *_id 유틸리티들의 출력결과를 이용하는 방법이 있습니다.

4. 디바이스를 위한 Custom Symlink 만들기

 

4.1. CD-ROM symlinks

여러분이 나중에 설치할 것들 중 소프트웨어들 중 어떤것들은(예를 들어 다양한 미디어 플레이어들) /dev/cdrom과 /dev/dvd symlink가 존재하고 있고 이들이 각각 CD-ROM과 DVD-ROM장치를 가리키고 있다고 가정하고 있을 것입니다. 또한 /etc/fstab에 해당 장치에 대한 symlink를 간단하게 추가할 수 있습니다. Udev는 각 장치들에 의존하는 이러한 symlink들을 생성하기 위해 여러가지 규칙 파일들을 만들어내는 스크립트를 담고 있습니다. 여기서 여러분들이 스크립트를 사용하고자 할 때 선택해야하는 두가지 모드가 있습니다.
 
첫번째로 스크립트는 "by-path" 모드로 실행될 수 있습니다. 이것은 보통 USB나 FireWire 장치들에서 사용되는데 CD나 DVD 장치로의 물리적인 경로에 의존하여 규칙을 생성합니다. 두번째는 "by-id" 모드입니다. 이것은 보통 IDE나 SCSI 장치들을 위한 것인데 일반적으로 경로는 Udev의 path_id 스크립트에 의해 결정되고 식별 문자열은 장치에 따라 ata_idscsi_id라는 프로그램이 하드웨어를 읽어서 사용됩니다.
 
각 접근방법마다 장점이 있습니다. 때문에 각 장치들의 종류에 따라 적절하게 선택하여 사용하시기 바랍니다. 만약 여러분이 장치가 삽입될 물리적인 경로를 미리 예상할 수 있다면(장치가 삽입될 포트나 슬롯의 위치 따위를 미리 예상한다는 뜻) "by-id" 모드를 사용해야 합니다. 여러분이 서로 다른 IDE 포트와 혹은 서로 다른 USB 컨넥터로 드라이브를 옮기려고 하는 경우가 여기에 해당됩니다. 반면에 여러분이 장치의 식별자가 변화될 것을 예상할 수 있는 경우, 예를들어 똑같은 기종의 다른 장치로 기존의 같은 포트 혹은 슬롯에 기존 장치를 대체하려고 하는 경우 여러분은 "by-path" 모드를 사용해야 합니다.
 
만약 여러분의 드라이브에서 이 두가지 종류의 경우가 모두 일어난다면 자주 일어나는 경우에 기초하여 모드를 선택하십시오.
 
중요한 점 외부 장치들(USB, CD 등등)은 절대로 by-path를 사용해서는 안됩니다. 왜냐하면 외부 포트로 새로운 장치들이 삽입될 수 있기 때문에 항상 물리적인 경로가 변경됩니다. 모든 외부적으로 연결된 장치들에 대한 이러한 문제는 CD나 DVD에 제한된 것이 아니라 Udev 규칙을 물리적인 경로로 판단하게끔 설정한 경우에 모든 외부 장치들의 경우에서 발생할 수 있습니다.
 
만약 여러분이 Udev 스크립트가 사용할 값들을 확인하고 싶다면 /sys 디렉토리에서 CD-ROM 장치에 맞는 디렉토리에서(이 경우에는 /sys/block/hdd) 다음과 같이 실행하면 됩니다.
udevadm test /sys/block/hdd
 
출력된 결과에서 *_id 라는 부분들을 잘 보십시오. 만약 비어있지 않다면 바로 이부분들이 "by-id" 모드로 ID_SERIAL 값이 사용된 겁니다, 다른 경우라면 아마 ID_MODEL이나 ID_REVISION의 조합을 사용했을 겁니다. "by-path" 모드가 사용되었다면 ID_PATH 값이 사용되었겠죠.
 
만약에 기본으로 사용되고 있는 모드가 여러분의 환경에 적합하지 않다고 생각되면 /lib/udev/rules.d/75-cd-aliases-generator.rules 파일을 다음과 같이 수정할 수 있습니다.(mode 부분을 "by-id"나 "by-path"로 바꿔서 사용할 수 있습니다.)
sed -i -e 's/"write_cd_rules"/"write_cd_rules mode"/' 
    /lib/udev/rules.d/75-cd-aliases-generator.rules
 
여기서 알아둬야 할 점은 여러분들은 호스트의 /dev/ 디렉토리에서 LFS 시스템으로 bind-mount를 이전에 실행했기 때문에 Udev 규칙 파일과 symlink를 동시에 만들 필요까지는 없습니다. 해당 장치에 대한 규칙과 symlink들은 여러분이 LFS 시스템을 처음 부팅할 때 만들어질 겁니다.
 
하지만 만약 여러분이 CD-ROM 장치로 두 개 이상 가지고 있다면 각각의 symlink는 순서가 랜덤이기 때문에 - 부팅때마다 가리키는 장치가 바뀔 수 있습니다. 이를 안정되게 하려면 /etc/udev/rules.d/70-persistent-cd.rules 파일을 부팅후에 수정하여 여러분이 원하는 대로 작동하게끔 만들 수 있습니다.

4.2. 중복된 장치 다루기

위에서 언급했던 것처럼 /dev 디렉토리에 나타나는 디바이스들의 순서는 랜덤입니다. 예를 들어, USB web camera와 TV tuner의 경우에 어떤 때는 /dev/video0 -> camera , /dev/video1 -> tuner로 되고 어떤 때는 이 둘이 서로 바뀌는 경우도 있습니다. 사운드 카드와 네트워크 카드를 제외한 모든 하드웨어의 종류는 udev 규칙을 이용해서 임의의 symlink를 만들어 유연하게 다룰 수 있습니다. 네트위크 카드의 경우에는 위에서 일반적인 네트워크 설정이라는 파트로 따로 다루었습니다. 사운드 카드에 대해서는 BLFS를 참고하십시오.
 
이러한 문제가 있는 장치들에 대해서 각각에 해당되는 디렉토리들이 /sys/class나 /sys/block 에 있는지 찾아보십시오. 비디오 장치들은 아마 /sys/class/video4linux/videoX에 있을 것입니다. 각각의 장치들을 식별할 수 있는 어트리뷰트를 찾고자 한다면 다음과 같이 실행하십시오.
udevadm info -a -p /sys/class/video4linux/video0
 
그리고 나서 다음과 같이 udev rules를 이용해 symlink를 만들어줍니다
cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"

# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", 
    SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", 
    SYMLINK+="tvtuner"

EOF
 
여전하 /dev/video0 과 /dev/video1은 랜덤으로 각 장치에 적용되지만 위에서처럼 특정 어트리뷰트를 사용하여 규칙을 만들어주면 /dev/tvtuner과 /dev/webcam이라는 symlink를 만들어서 이를 마운트하는데 사용할 수 있습니다.

5. LFS-Bootscripts-20120901

빌드 시간: <= 0.1 SBU 필요 공간: 260 KB
 
패키지를 설치합니다
make install
 
설치되는 스크립트들:
  • checkfs, cleanfs, console, functions, halt, ifdown, ifup, localnet, modules, mountfs, mountkernfs, network, rc, reboot, sendsignals, setclock, static, swap, sysctl, sysklogd, template, udev, and udev_retry
설치되는 디렉토리:
  • /etc/rc.d, /etc/init.d (symbolic link), /etc/sysconfig, /lib/services, /lib/lsb (symbolic link)

6. 부트스크립트의 작동 원리

Linux는 run-levels의 개념에 기초한 SysVinit이라는 독특한 특징을 갖고 있습니다. 이것은 다른 시스템들과 상당히 다를 수 있어서 특정 리눅스 배포판에서 작동된다고 해서 LFS에서도 잘 작동된다고 말할 수가 없습니다. LFS는 일반적인 표준에 최대한 따르려 하지만 LFS 만의 방식을 갖고 있습니다.
 
SysVinit(이제부터 간단하게 "init"이라고 언급하겠습니다) 는 run-level 이론을 사용합니다. 여기에는 0부터 6까지의 run-level이 있습니다.(여기에 자세히 알고 싶으신 분은 init(8)을 참고하십시오.) 컴퓨터가 부팅되면 여기에 각 run-level에 해당하는 적절한 행동들을 수행합니다. 기본 run-level은 3입니다. 다음은 각 레벨에 대해 간단하게 설명한 것입니다.
 
1: halt the computer(컴퓨터를 종료)

2: single-user mode(1개의 사용자 모드)

3: multi-user mode without networking(네트워킹을 지원하지 않는 멀티 사용자 모드)

4: multi-user mode with networking(네트워킹을 지원하는 멀티 사용자 모드)

5: reserved for customization, otherwise does the same as 3(사용자가 실행되도록 예약해놓은 것들, 다른것은 level-3 과 동일함)

6: same as 4, it is usually used for GUI login(like X's xdm or KDE's kdm(level-4와 동일하지만 GUI 로그인을 사용함)

7.: reboot the computer(컴퓨터 재부팅)
 

6.1. Sysvinit 설정하기

커널이 초기화되는 동안 가장 먼저 실행되는 것은 기본적으로 init 프로그램입니다. 이 프로그램은 /etc/inittab이라는 초기화 파일을 읽습니다.
cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc S

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF
 
초기화 파일에 대한 설명은 inittab 맨페이지에 있습니다. LFS 에서는 key command는 rc입니다. 위에서 보면 알 수 있듯이 rc를 이용하여 /etc/rc.d/rcsysinit.d 디렉토리에 있는 S 를 실행시킵니다.(si::sysinit:/etc/rc.d/init.d/rc S 부분) 뒤따라서 /etc/rc.d/rc?.d 디렉토리에 있는 S와 함께 스크립트를 실행시킵니다. 여기서 사용된 물음포는 initdefault 값에 의해 결정된 값을 말합니다.
 
편의에 따라 rc 스크립트ᅟ는 /lib/lsb/init-functions 엔에 있는 함수 라이브러리를 읽어들입니다. 이 라이브러리는 또한 /etc/sysconfig/rc.site라는 부가적인 설정 파일을 읽습니다. 다음 절에서 설명하겠지만 모든 시스템 설정 파일의 파라미터들은 이 하나의 파일에 대신 추가될 수 있습니다.
 
디버깅의 편의를 위해 함수 스크립트들의 모든 출력은 /run/var/bootlog에 저장합니다. 하지만 /run 디렉토리가 tmpfs이기 때문에 이 파일은 boot 때마다 바뀝니다. 좀 더 영구적인(?) 부트때마다 계속해서 추가되는 로그파일에서 로그를 확인하고 싶다면 /var/log/boot.log 파일의 끝부분을 살펴보십시오.

6.2. Run Level 바꾸기

run-level은 init <runlevel>으로 바꿀수 있습니다. 예를 들어 컴퓨터를 재부팅하기 위해 init 6을 사용자가 reboot 명령어 대신 사용할 수 있습니다. 같은 원리로 init 0을 하게 되면 halt 명령어 대신 사용할 수 있습니다.
 
/etc/rc.d 밑에는 rc?.d(?에는 run-level이 들어감)와 rcsysinit.d같은 디렉토리와 모든 symbolic 링크들이 들어있습니다. 어떤것은 K로 시작하는 것도 있고 다른 어떤것은 S로 시작되는 것, 혹은 이 둘을 모두 가지고 있는 것들이 있습니다. K는 서비스를 Kill- 멈추는 것을 뜻하고 S는 시작하라는 것을 의미합니다. 스크립트가 실행되는 순서를 위해 00부터 99까지의 숫자를 사용합니다. init이 다른 run-level로 스위치하면 각 run-level에 맞는 서비스들이 시작되거나 멈춥니다.
 
진짜 스크립트는 /etc/rc.d/init.d 안에 있습니다. 이것들이 실제 역할이고 symlink들이 이것들을 포인팅하고 있습니다. K 링크와 S 링크또한 /etc/rc.d/init.d에서의 같은 스크립트를 가리키고 있습니다. 이것은 스크립트에 start, stop, restart, reload, status 같은 다른 파타미터들이 전달될 수 있기 때문입니다. 만약 K 링크를 만나면 스크립트는 stop argument가 실행될 것이고 S 링크를 만나면 start argument로 실행될 겁니다.
 
여기 설명에서 빠뜨린 것이 한가지 있습니다. rc0.d와 rc6.d 디렉토리 안에서 S로 시작하는 링크는 아무것도 실행하지 않을 것입니다. 왜냐하면 S로 시작하였기 때문에 stop 파라미터가 전해지기 때문입니다. 그리고 run-level또한 재부팅되거나 시스템을 종료하려는 것이기 때문에 실행되는 것은 아무것도 없이 전부 중단되려할 것입니다.


 
start 서비스를 실행합니다.
 
stop 서비스를 멈춥니다.
 
restart 서비스를 멈추었다가 다시 실행합니다.
 
reload 서비스의 설정파일이 업데이트된 경우 이를 위해 다시 재시작할 필요 없이 설정파일만 다시 불러올 수 있습니다.
 
status 서비스가 실행중일 경우 해당 프로세스ID를 출력합니다.
 
 

7. 시스템 호스트이름 설정하기

localnet스크립트의 작업 중 하나로써 시스템의 호스트이름을 설정합니다. 이것은 /etc/sysconfig/network 파일을 수정하여 설정할 수 있습니다.
 
/etc/sysconfig/network 파일을 만들어 다음과 같이 호스트이름을 만들어줍니다:
echo "HOSTNAME=<lfs>" > /etc/sysconfig/network
< lfs> 대신에 적절한 호스트이름을 사용하십시오. 대신 Fully Qualified Domain Name(FQDN)은 여기에 사용하지 마십시오. FQDN은 /etc/hosts 파일에 입력할 것입니다.
 
FQDN이란?

예를을어 ktword가 호스트 이름이고 kt.co.kr이 도메인 이름이라면 FQDN은 ktword.kt.co.kr이 됩니다.
 

8. setclock 스크립트 설정하기

setclock스크립트는 하드웨어 클럭으로부터 시간을 읽습니다. 또한 이것은 BIOS 또는 CMOS(Complementary Metal Oxide Semiconductor) 클럭이라고도 알려져 있습니다. 만약 하드웨어 시계가 UTC를 설정이 되어 있다면 스크립트는 하드웨어 클럭의 시간을 /etc/localtime 파일을 이용해 지역 시간으로 바꿉니다. 해당 지역(timezone)은 사용자가 정의합니다. 만약 시스템에서 이러한 파일들이 아무런 것도 보이지 않는다면 수동으로 설정해주어야 합니다.
 
setclock은 udev를 통해서 실행되는데 커널이 부트시에 하드웨어를 감지할 때 실행됩니다. 이것은 stop 파라미터로 시스템의 시간을 CMOS clock에 저장하기 위해 수동으로 실행될 수 있습니다.
 
만약 여러분의 하드웨어 clock이 UTC로 설정되어있는지 기억하지 못하겠다면 hwclock --localtime --show 명령어를 통해서 알 수 있습니다. 이것은 하드웨어 clock에 따른 현재의 시간을 나타냅니다. 만약 이 시간이 여러분이 보는것과 일치한다면 하드웨어 clock은 local time으로 설정된 것입니다. 만약 local time이 아니라면 UTC 로 바꾸십시오. 이에 적절하게 timezone을 설정하여 hwclock으로 출력되는 결과물을 올바르게 바꿀수 있습니다.
 
/etc/sysconfig/clock을 다음과 같이 만들어줍니다.
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock

UTC=1

# Set this to any options you might need to give to hwclock, 
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=

# End /etc/sysconfig/clock
EOF
 
여기에 대한 도움말을 보고 싶다면 다음 링크를 참고하세요: [http]http://www.linuxfromscratch.org/hints/downloads/files/time.txt

9. 리눅스 콘솔 설정하기

이번 절에서는 어떻게 console bootscript에서 키보드 맵이나 콘솔 폰트, 커널 로그 레벨을 설정하는지에 대해서 알아보겠습니다. 만약 ASCII 문자를 사용하지 않는 경우가 아니거나 U.S 키보드를 사용하는 경우는 이 절의 많은 부분에서 그냥 넘어갈 수 있을 것입니다. 여기서 다룰 설정파일 없이는 console bootscript는 아무것도 실행하지 않을 것입니다.
 
console 스크립트는 /etc/sys/config/console 파일로부터 설정 정보들을 읽어들입니다. 어떤 keymap과 화면에 폰트를 사용할건지에 대해 결정합니다. 이 부분에서 언어에 따른 설정 방법은 다음 링크를 참고하십시오: [http]http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html 만일 여전히 이들 정보가 불확실하다면 /lib/kbd 디렉토리에서 유효한 keymap들과 폰트들을 확인하십시오.
 
/etc/sysconfig/console 파일은 반드시 VARIABLE="value"라는 형식으로 다음 설명하는 것들이 포함되어 있어야 합니다:
 
  • LOGLEVEL
    이 변수는 dmesg에 의해 콘솔로 보내지는 커널 메세지의 로그 레벨을 설정합니다. "1"부터 "8"까지 가능하고 기본값은 "7"입니다.
  • KEYMAP
    이 변수는 loadkeys 프로그램을 위한 argument로 "es"같이 keymap의 이름입니다. 만약 변수가 설정되어있지 않다면 bootscript는 loadkeys프로그램을 실행하지 않고 기본 커널 키맵을 사용할 겁니다.
  • KEYMAP_CORRECTIONS
    이 변수는 아주 드물게 사용되지만 loadkeys 프로그램에서 second call을 위해 사용되는 argument입니다. 만약 지정한 keymap이 완전하지 못하거나 해당 keymap에 대해 약간씩의 수정을 하기 위해 설정되는 값입니다.
  • FONT
    setfont 프로그램을 위한 argument입니다. 보통 "-m"과 함께 폰트 이름과 어플리케이션에서 불러올 character map을 포함합니다. 예를들어 "lat1-16" 폰트는 "8859-1" 어플리케이션 character map(이건 미국일 경우에 해당하는 폰트 설정의 예입니다)과 함께 사용되어 "lat1-16 -m 8859-1" 과 같이 설정할 수 있습니다. UTF-8인 경우는 커널이 8비트짜리 key code를 위해 어플리케이션 character map을 사용하기 때문에 따로 -m 파라미터를 사용하여 keymap을 사용할 필요 없이 utf-8이라고만 해주어도 됩니다.
  • UNICODE
    '1'로 설정하면 "yes" 혹은 "true"값이 됩니다.
  • LEGACY_CHARSET
    많은 키보드 레이아웃에서 Unicode 키맵을 위한 것이 없습니다. 때문에 이 값을 설정하게 되면 console bootscript는 UTF-8로의 유효한 keymap으로 변환을 하려할 것입니다.

10. sysklogd 스크립트 설정하기

sysklogd 스크립트는 syslogd 프로그램을 -m 0 옵션과 함께 불러옵니다. 이 옵션은 주기적으로 20분마다 syslogd가 로그파일에 timestamp하는 기능을 끕니다. 만약 이러한 기능을 끄기 싫다면 /etc/sysconfig/rc.site파일을 서정하여 SYSKLOGD_PARMS 변수를 원하는 값으로 정의하십시오. 예를 들어 모든 파라미터를 지우면 해당 값은 null값이 됩니다.
 
더 많은 옵션에 대해 알고 싶으시면 man syslogd를 참고하십시오.

11. rc.site 파일

/etc/sysconfig/rc.site파일은 각 bootscript를 자동적으로 설정합니다. 이것은 /etc/sysconfig/ 디렉토리 안에 있는 hostname, console, clock들에 특정 변수를 대신 설정합니다. 만약 rc.site와 해당 변수들에 대한 파일이 따로 있는 경우에는 rc.site보다 각 파일들의 설정이 우선권을 갖게 됩니다.
 
rc.site는 부트 프로세스에서 사용될 수 있는 파라미터들을 포함하고 있습니다. IPROMPT 변수는 bootscript를 실행하면서 선택이 가능합니다. 다른 옵션들은 파일의 comment형식으로 설명되어 있습니다.
 
다음은 default 버전의 rc.site파일입니다
# rc.site
# Optional parameters for boot scripts.

# Distro Information
# These values, if specified here, override the defaults
#DISTRO="Linux From Scratch" # The distro name
#DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address
#DISTRO_MINI="LFS" # Short name used in filenames for distro config

# Define custom colors used in messages printed to the screen

# Please consult `man console_codes` for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font.  This does
# not affect framebuffer consoles

# These values, if specified here, override the defaults
#BRACKET="�33[1;34m" # Blue
#FAILURE="�33[1;31m" # Red
#INFO="�33[1;36m"    # Cyan
#NORMAL="�33[0;39m"  # Grey
#SUCCESS="�33[1;32m" # Green
#WARNING="�33[1;33m" # Yellow

# Use a colored prefix
# These values, if specified here, override the defaults
#BMPREFIX="     "
#SUCCESS_PREFIX="${SUCCESS}  *  ${NORMAL}"
#FAILURE_PREFIX="${FAILURE}*****${NORMAL}"
#WARNING_PREFIX="${WARNING} *** ${NORMAL}"

# Interactive startup
#IPROMPT="yes" # Whether to display the interactive boot prompt
#itime="3"    # The amount of time (in seconds) to display the prompt

# The total length of the distro welcome string, without escape codes
#wlen=$(echo "Welcome to ${DISTRO}" | wc -c )
#welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}"

# The total length of the interactive string, without escape codes
#ilen=$(echo "Press 'I' to enter interactive startup" | wc -c )
#i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup"

# Set scripts to skip the file system check on reboot
#FASTBOOT=yes

# Skip reading from the console
#HEADLESS=yes

# Skip cleaning /tmp
#SKIPTMPCLEAN=yes

# For setclock
#UTC=1
#CLOCKPARAMS=

# For consolelog
#LOGLEVEL=5

# For network
#HOSTNAME=mylfs

# Delay between TERM and KILL signals at shutdown
#KILLDELAY=3

# Optional sysklogd parameters
#SYSKLOGD_PARMS="-m 0"

# Console parameters
#UNICODE=1
#KEYMAP="de-latin1"
#KEYMAP_CORRECTIONS="euro2"
#FONT="lat0-16 -m 8859-15"
#LEGACY_CHARSET=

 
 

12. The Bash Shell Startup Files

/bin/bash 셸 프로그램은 실행될 때 셸 안의 환경을 만드는 데 startup 파일들의 컬렉션을 사용합니다. 각 파일들은 /etc 안에 전반적인 설정파일이 있고 home 디렉토리에 같은 파일이 있는 경우 /etc 안의 전반적인 설정을 홈 디렉토리의 설정이 대신합니다.
 
shell에는 login shell, non-login shell, non-interactive shell이 있는데 login shell(/bin/login)이 /etc/passwd 파일을 읽어서 성공적으로 로그인을 합니다. non-login shell은 커맨드 라인을 시작하는것이고 non-interactive shell은 사용자의 입력을 기다리지 않기 때문에 스크립트를 진행하는데 사용됩니다.
 
여기에 더 자세한 설명을 원하시면 info bash에서 Bash Startup Files and Interactive Shells 부분을 참고하세요.
 
/etc/profile과 ~/.bash_profile은 interactive login shell이 실행되었을때 불러오는 파일입니다.
 
/etc/profile 파일은 몇몇의 환경변수들을 불러오기 위해 설정하는 것입니다. 해당 변수들을 올바르게 설정하면 -
  • 여러분의 언어에 맞게 프로그램의 출력결과를 변환합니다.
  • bash가 사용하는 적절한 로케일을 설정할 수 있습니다.
  • 나라를 알파벳순으로 정렬할 수 있습니다.
  • 기본 paper size를 수정할 수 있습니다.
  • 날짜, 시간, 통화에 사용되는 형식을 정할 수 있습니다.
     
아래에 나오는 <ll>을 여러분이 원하는 언어(e.g. "ko")로 바꾸시고 <CC>는 "KR"같은 적절한 나라변 코드로 바꾸십시오. <charmap>은 여러분이 선택한 로케일로 기본 character map을 바꾸는 것입니다.(euckr 이나 utf.8을 사용하시면 됩니다)
 
Glibc에 의해 지원되는 로케일 목록을 보려면 다음과 같이 실행하십시오:
locale -a
 
/etc/profile 파일에 여러분이 선호하는 로케일로 설정하십시오:
cat > /etc/profile << "EOF"
# Begin /etc/profile

export LANG=<ll>_<CC>.<charmap><@modifiers>

# End /etc/profile
EOF

13. /etc/inputrc 파일 생성하기

input rc 파일은 특정 상황을 위해 키보드 매핑을 조정하는 파일입니다. 이 파일은 Readline에 의해 사용됩니다.
 
대부분의 사람들이 키보드 매핑(단축키같은 것)을 필요로 하지 않습니다. 만일 여러분이 기본 매핑을 바꾸고 싶거나 새로운 것을 만들고 싶다면 .inputrc 파일을 홈 디렉토리에 만들어 설정할 수 있습니다.
 
자세한 정보는 info bashinfo readline을 살펴보시기 바랍니다.
 
다음은 일반적인 inputrc 파일입니다. 다음과 같이 새로운 파일을 하나 만들어줍니다.
cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag On
set input-meta On

# Turns off 8th bit stripping
set convert-meta Off

# Keep the 8th bit for display
set output-meta On

# none, visible or audible
set bell-style none

# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"eOd": backward-word
"eOc": forward-word

# for linux console
"e[1~": beginning-of-line
"e[4~": end-of-line
"e[5~": beginning-of-history
"e[6~": end-of-history
"e[3~": delete-char
"e[2~": quoted-insert

# for xterm
"eOH": beginning-of-line
"eOF": end-of-line

# for Konsole
"e[H": beginning-of-line
"e[F": end-of-line

# End /etc/inputrc
EOF

List of Articles
번호 제목 글쓴이 날짜sort 조회 수
169 Linux LFS/TheEnd - 마무리 LynX 2014-08-06 382
168 Linux LFS/Make Bootable System - LFS 시스템 부팅하기 LynX 2014-08-06 445
» Linux LFS/Bootscripts - 시스템 부트로더 설정하기 [8] LynX 2014-08-06 570
166 Linux LFS/Building - 빌드하기 [11] LynX 2014-08-06 2614
165 Linux LFS/Preparation - 준비 LynX 2014-08-06 745
164 Linux LFS/Introduction - 소개 [8] LynX 2014-08-06 669
163 Linux LFS/Preface - 서문 [9] LynX 2014-08-06 1072
162 Linux Custom Kernel 컴파일링 & 설치하기 [8] LynX 2014-08-06 457
161 Linux PDO_MYSQL 설치 [8] LynX 2014-08-01 310
160 Linux sendmail, dovecot 설치 및 설정 [20] LynX 2014-08-01 2724
159 Linux rc.local 서비스 등록하기 LynX 2014-07-22 504
158 Linux systemd unit 등록 옵션 LynX 2014-07-22 20455
157 Linux 페도라17(centos7) 새로운 서비스 관리 LynX 2014-07-20 570
156 Linux SSH 컴파일 설치 LynX 2014-07-19 376
155 Xpress Engine XML 쿼리 대신 직접 mysql 사용하기 LynX 2014-07-19 273
154 Xpress Engine XML 쿼리 대신 직접 mysql 사용하기 LynX 2014-07-16 391
153 Linux 리눅스 기본 명령어 LynX 2014-07-16 792
152 Xpress Engine xe 외부 php 파일에서 db 접근하기 executeQuery() LynX 2014-07-14 919
151 Xpress Engine xe 모든 변수값 출력해 보기 LynX 2014-07-14 93715
150 Xpress Engine XE용 query xml 방식으로 일반 테이블도 접근 처리 하기 LynX 2014-07-14 459

XE Login