Linux 파일 시스템을 초기화하는 방법은 무엇입니까?
System V init 시작 프로세스
요약하자면 Linux/Unix 시스템에는 일반적으로 두 가지 초기화 시작 방법이 있습니다.
1) BSD 시스템 초기화
2) System V init
대부분의 Linux 배포판은 System V init와 유사한 init, 즉 Sys V init를 사용합니다. 이는 기존 BSD 시스템 init보다 더 쉽고 효율적입니다.
System V init의 주요 아이디어는 다양한 "런레벨"을 정의하는 것입니다. 구성 파일 /etc/inittab은 시스템 부팅 시 실행 수준과 실행 수준에 들어가거나 전환할 때 수행할 작업을 정의합니다. 각 런레벨은 하위 디렉토리 /etc/rc.d/rcX.d에 해당합니다.
각 rcX.d 디렉토리에는 S 또는 K로 시작하는 일부 파일 링크가 포함되어 있습니다. 이러한 링크가 가리키는 스크립트는 시작 및 중지 매개변수를 받을 수 있습니다. S로 시작하는 링크는 일반적으로 서비스를 시작하기 위해 시작 매개변수를 전달하고, 일반적으로 서비스를 중지하기 위해 K는 중지 매개변수를 전달합니다.
다음은 대략적인 System V init 프로세스입니다:
(1) init 프로세스에 의해 실행되는 첫 번째 스크립트는 /etc/rc.d/rc.sysinit이며, 주로 다음 작업을 수행합니다. 스왑 파티션 시작, 호스트 이름 설정, 파일 시스템 확인 및 마운트, 하드웨어 모듈 로드 및 초기화를 포함한 초기화 작업이 수행됩니다.
(2) 기본 작동 수준 모드. 이 단계의 내용은 주로 /etc/inittab에 반영됩니다. inittab 파일은 init 프로세스에 입력할 실행 레벨과 해당 실행 레벨에 대한 구성 파일을 찾을 위치를 알려줍니다.
(3) 실행 /etc /rc.d/rc.local 스크립트 파일. 이는 또한 init 프로세스 중에 실행되는 마지막 스크립트 파일이므로 사용자는 로그인하기 전에 실행해야 하는 일부 명령을 이 파일에 추가할 수 있습니다.
(4) /bin/login 프로그램 실행
p>참고:
System V init는 단지 모드일 뿐입니다. 각 시스템 초기화는 다르지만 일반적으로 크게 다르지 않습니다. 예를 들어 busybox가 실행하는 첫 번째 시작 스크립트는 /etc/init.d/rcS이며 변경할 수 없다는 점에서 위에서 언급한 것과 다릅니다.
LFS 파일 시스템 초기화 예시
inittab 파일
다음 내용에서 볼 수 있듯이 첫 번째 실행은 /etc/rc.d/init이다. d /rc 파일에서 이 파일에 전달된 매개변수는 숫자이며, rc는 전달된 숫자에서 rcX.d 디렉터리의 경로를 합성한 다음 그 안의 모든 스크립트 링크를 실행합니다. 물론 이것은 기능의 일부일 뿐입니다.
# 시작 /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d /init.d/rc sysinit #초기화 스크립트를 설정할 수 있습니다
l0:0:wait:/etc/rc.d/init.d/rc 0 p >
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
...
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r 지금
su:S016:once:/sbin/ sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
...< / p>
# /etc/inittab 끝
etc 디렉토리 구조
일부일 뿐이며 삭제되었습니다.
.
├── fstab
├── inittab
├── inputrc
p>├── 프로필
├── rc.d
│ ├── init.d
│ │ ├── checkfs
│ │ ├── cleanfs
...
│ │ ├── 모듈
│ │ ├── mountfs p>
│ │ ├── mountkernfs
│ │ ├── 네트워크
│ │ ├── rc #부팅할 때 실행합니다.
│ │ ├── 재부팅
...
│ ├── rc0.d
│ │ ├── K80network -> ../init. d/네트워크
│ │ ├── K90sysklogd -> ../init.d/sysklogd
│ │ ├── S60sendsignals -> ../init.d/sendsignals
│ │ ├── S70mountfs -> ../init.d/mountfs
│ │ ├── S80swap -> ../init.d/swap
│ │ ├── S90localnet -> ../init.d/localnet
│ │ └── S99halt -> ../init.d/halt
│ ├ ── rc1.d
│ │ ├── K80network -> ../init.d/network
│ │ └── K90sysklogd -> ../init.d/ sysklogd
│ ├── rc2.d
│ │ ├── K80network -> ../init.d/network
│ │ └── K90sysklogd -> ../init.d/sysklogd
│ ├── rc3.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd p>
│ │ └── S20network -> ../init.d/network
│ ├── rc4.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├── rc5.d
│ │ ├── S10sysklogd -> ../init.d/sysklogd
│ │ └── S20network -> ../init.d/network
│ ├ ── rc6.d
│ │ ├── K80network -> ../init.d/network
│ │ ├── K90sysklogd -> ../init.d/ sysklogd
│ │ ├── S60sendsignals -> ../init.d/sendsignals
│ │ ├── S70mountfs -> ../init.d/mountfs
│ │ ├── S80swap -> ../init.d/swap
│ │ ├── S90localnet -> ../init.d/localnet
│ │ └── S99reboot -> ../init.d/reboot
│ └── rcsysinit.d
│ ├── S00mountkernfs -> ../init.d /mountkernfs
│ ├── S02consolelog -> ../init.d/consolelog
│ ├── S05modules -> ../init.d/modules
...
├── udev
│ ├── rule.d
│ │ └── 55-lfs.rules p>
│ └── udev.conf
└── vimrc
네트워크 스크립트
#!/bin/sh
. /etc/sysconfig/rc
.${rc_functions}
./etc/sysconfig/network
"${1}"
start)
# 모든 네트워크 인터페이스를 시작합니다
for file in ${network_devices}/ifconfig.*
do
인터페이스=${file##*/ifconfig.}
# $file이 *인 경우 건너뜁니다(아무 것도 발견되지 않았기 때문에)
if [ "${interface} " = "*" ]
다음
계속
fi
IN_BOOT=1 ${network_devices}/ifup ${interface}
완료
;;
중지)
# 목록 반전
FILES=""
${network_devices}/ifconfig의 파일에 대해.*
수행
FILES="${file} ${FILES}"
완료
# 모든 네트워크 인터페이스를 중지합니다
for file in ${FILES}
do
interface=${file##*/ ifconfig.}
# $file이 *인 경우 건너뛰기(아무 것도 발견되지 않았기 때문에)
if [ "${interface}" = "*" ]
그런 다음
계속
fi
IN_BOOT=1 ${network_devices}/ifdown ${interface}
완료
;;
다시 시작)
${0} 중지
수면 1
${0} 시작
;;
*)
echo "사용법: ${0} {start|stop|restart}"
종료 1
;;
esac
# 끝 /etc/rc.d/init.d/network