Linux 부츠

밝혀진 바와 같이 부팅 프로세스에는 별다른 것이 없습니다.

1. 부트 로더는 커널 이미지를 찾습니다. disk, 메모리에 로드하고 시작합니다.
2. 커널은 장치와 STI 드라이버를 초기화합니다.
3. 커널은 루트 파일을 마운트합니다.system.
4. 커널은 일정을 호출 init에게 시작합니다.
5. 초기화 모션의 프로세스의 나머지 부분을 설정합니다.
6. 부팅 시퀀스의 일부로 초기화 시작하면 로그온 할 수 있도록하는 마지막 처리합니다.

부팅 프로세스의 각 단계를 식별하는 것은 부팅 문제를 해결하고 다음을 이해하는 데 매우 중요합니다. system 전체적으로. 시작하려면 부팅 로더에 집중하십시오.이 초기 화면 또는 컴퓨터가 전원 켜기 자체 테스트를 수행 한 후 표시되는 프롬프트 인 system 실행합니다. 선택 후 부트 로더는 다음을 실행합니다. Linux 커널, 제어를 전달 system 커널에.

다른 곳에서이 문서를 발췌되는이 책에서 커널에 대한 자세한 설명이 있습니다. 이 문서를 포함 커널 초기화 단계, 커널이 하드웨어에 대한 메시지를 출력하는 단계 system. 커널은 커널이 다음을 마운트했다는 메시지를 표시 한 직후에 초기화를 시작합니다. 루트 파일system:

VFS : 마운트 루트(ext2 파일system) 읽기 전용.

곧 init 시작에 대한 메시지가 표시되고 system 서비스 시작 메시지가 표시되고 마지막으로 일종의 로그인 프롬프트가 표시됩니다.

주의사항 :에 레드햇 Linux, init 메모는 Red Hat에 "환영"하기 때문에 특히 분명합니다. Linux.” 이후의 모든 메시지는 화면 오른쪽의 괄호 안에 성공 또는 실패를 표시합니다.

당신이 가장 컨트롤이 부팅 순서의 WHERE 부분이기 때문에이 장의 대부분은 초기화와 함께 다룹니다.
INIT

init에는 특별한 것이 없습니다. 여느때와 같은 프로그램이다. Linux system, 그리고 다른 것과 함께 / sbin에서 찾을 수 있습니다. system 바이너리. init의 주요 목적은 특정 순서로 다른 프로그램을 시작하고 중지하는 것입니다. 이 시퀀스가 ​​어떻게 작동하는지 알아야합니다.

약간의 변형이 있지만 대부분은 Linux 배포판 사용 System 여기서 논의한 V 스타일. 일부 배포판은 BSD init와 유사한 더 간단한 버전을 사용하지만이 문제가 발생할 가능성은 거의 없습니다.

런레벨

주어진 시간에 Linux system, 특정 기본 프로세스 집합이 실행 중입니다. 이 상태 machine은 런레벨이라고하며 0에서 6까지의 숫자로 표시됩니다. system 단일 실행 수준에서 대부분의 시간을 보냅니다. 그러나 닫을 때 mac아래로 내려 가면 init는 다른 런레벨로 전환하여 system 순서대로 서비스를 제공하고 커널에 중지를 지시합니다. 또 다른 런레벨은 단일 사용자를 위한 것입니다. mode, 나중에 논의.

런레벨을 다루는 가장 쉬운 방법은 초기화 구성 파일인 /etc/inittab을 검사하는 것입니다. 다음과 같은 줄을 찾습니다.

ID : 5 : 초기화default:

이 줄은 default 런레벨 system is 5. inittab 파일의 모든 라인은 다음 순서로 발생하는 콜론으로 구분된 XNUMX개의 필드가 있는 이 형식을 취합니다.
# 고유 식별자 (짧은 문자열, 이러한 앞의 예에서 ID로)
# 해당 런레벨 번호 (들)
# init가 취해야하는 액션 (이전 예제에서 액션은 default 런레벨 5)
실행하기 # 명령 (옵션)

이전 초기화에서 실행할 명령이 없습니다.default 예를 들어 명령은 설정 컨텍스트에서 의미가 없기 때문입니다. default 런레벨. 다음과 같은 줄이 보일 때까지 inittab에서 조금 더 아래를보십시오.

l5 : 5 : :/ 등 / 대기 시킬수있다 / RC 5

이 라인은 대부분의 system rc * .d 및 init.d 디렉토리를 통한 구성 및 서비스. init가 런레벨 5에서 ​​/etc/rc.d/rc 5라는 명령을 실행하도록 설정되어 있음을 알 수 있습니다. wait 액션은 init가 명령을 실행하는시기와 방법을 알려줍니다. run rc 5 once when enterrunlevel 5를 호출 한 다음 다른 작업을 수행하기 전에이 명령이 완료 될 때까지 기다리십시오.

여러 가지 작업이 있습니다. add초기화에default 특히 전원 관리와 관련하여 기다리면 inittab (5) 매뉴얼 페이지에서 이에 대한 모든 것을 알려줍니다. 다음 섹션에서는 가장 많이 접하게 될 항목에 대해 설명합니다.

리스폰

respawn 작업으로 인해 init가 다음 명령을 실행하고 명령 실행이 완료되면 다시 실행합니다. inittab 파일에서 다음 행과 유사한 내용을 볼 수 있습니다.

1 : 2345 : 부활 :/의 sbin / mingetty tty1

게티 프로그램은 로그인 프롬프트를 제공합니다. 앞의 줄은 첫 번째 가상 콘솔 (/ dev에 / tty1), 당신은 ALT 또는 CONTROL-ALT-F1 F1을 누르면 볼 하나입니다. 로그 아웃 한 후 리스폰 작업은 로그인 프롬프트를 다시 제공합니다.

ctrl알트 델

최대 XNUMXW 출력을 제공하는 ctrlaltdel 액션은 system 가상 콘솔에서 CONTROL-ALT-DELETE를 누르면 수행됩니다. 대부분 systems, 이것은 shutdown 명령을 사용하는 일종의 재부팅 명령입니다.

내의 sysinit

sysinit 액션은 init가 시작될 때 가장 먼저 실행되어야합니다. enter모든 런레벨에서.

어떻게 실행 레벨의 프로세스가 시작

이제 시작하는 방법을 배울 준비가되었습니다. system 로그인을 허용하기 직전에 서비스를 제공합니다. 이전의이 inittab 행을 기억하십시오.

l5 : 5 : :/ 등 / 대기 시킬수있다 / RC 5

이 작은 줄은 대부분의 다른 프로그램을 트리거합니다. RC는 실행 명령을 의미합니다, 당신은 사람들이 스크립트, 프로그램 또는 서비스로 명령을 참조하십시오 들립니다. 그래서,이 명령은 어쨌든 어디?

런레벨 5의 경우이 예에서 명령은 /etc/rc.d/rc5.d 또는 /etc/rc5.d에있을 수 있습니다. 런레벨 1은 rc1.d를, 런레벨 2는 rc2.d를 사용합니다. 다음을 찾을 수 있습니다. items rc5.d 디렉토리에서 :

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

RC 5 명령은 GMT 명령을 실행하여이 런레벨 디렉토리에서 프로그램을 시작합니다 :

S10sysklogd 홈
S12kerneld 홈
S15netstd_init 홈
S18netbase 홈
...
S99sshd 홈

각 명령에서 시작 인수를 확인하십시오. 명령 이름의 S는 명령이 시작 시 실행되어야 함을 의미합니다. mode, 그리고 숫자(00에서 99까지)는 시퀀스에서 rc가 명령을 시작하는 위치를 결정합니다.

의 rc *. D 명령은 일반적으로 / sbin이나 / usr / sbin의 프로그램을 시작할 쉘 스크립트입니다. 일반적으로, 당신은 명령 중 하나가 실제로 작거나 호출기 다른 프로그램과 스크립트를보고 않으며하여 알아낼 수 있습니다.

이러한 서비스 중 하나를 직접 시작할 수 있습니다. 예를 들어 httpd 웹 서버 프로그램을 수동으로 시작하려면 S99httpd start를 실행합니다. 마찬가지로 서비스 중 하나를 종료해야하는 경우 machine이 켜져 있으면 stop 인수를 사용하여 rc * .d 디렉토리에서 명령을 실행할 수 있습니다 (예 : S99httpd stop).

일부 rc*.d 디렉토리에는 K로 시작하는 명령("kill" 또는 mode). 이 경우 rc는 start 대신 stop 인수를 사용하여 명령을 실행합니다. 실행 레벨에서 K 명령을 접할 가능성이 가장 높습니다. system 아래로.

Add서비스 만들기 및 제거

당신이 원하는 경우 addrc*.d 디렉토리의 서비스를 삭제 또는 수정하려면 내부 파일을 자세히 살펴봐야 합니다. 긴 목록은 다음과 같은 구조를 나타냅니다.

lrwxrwxrwx. . . S10sysklogd -> .. / init.d에 / 위해서는 sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d에 / kerneld가
lrwxrwxrwx. . . S15netstd_init -> .. / init.d에 / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d에 / 위해 netbase
...

rc*.d 디렉토리의 명령은 실제로 init.d 디렉토리(일반적으로 /etc 또는 /etc/rc.d)의 파일에 대한 심볼릭 링크입니다. Linux 배포판에는 모든 런레벨에 대해 동일한 시작 스크립트를 사용할 수 있도록 이러한 링크가 포함되어 있습니다. 이 규칙은 필수 사항은 아니지만 종종 조직을 좀 더 쉽게 만듭니다.

init.d 디렉토리의 명령 중 하나가 특정 런레벨에서 실행되는 것을 방지하려면 적절한 rc * .d 디렉토리에서 심볼릭 링크를 제거 할 수 있습니다. 이 방법은 작동하지만 실수를하여 링크를 제자리에 다시 넣어야하는 경우 링크의 정확한 이름을 기억하는 데 문제가있을 수 있습니다. 따라서 rc * .d 디렉토리의 링크를 제거해서는 안됩니다. add 다음과 같이 링크 이름 시작 부분에 밑줄 (_)을 추가합니다.

MV의 S99httpd의 _S99httpd

부팅 할 때 rc는 S 또는 K로 시작하지 않기 때문에 _S99httpd를 무시합니다. 또한 원래 이름은 여전히 ​​분명하며 문제가 발생하여 수동으로 시작해야하는 경우 명령에 빠르게 액세스 할 수 있습니다.

에 add 서비스의 경우 init.d 디렉토리에 다른 스크립트와 같은 스크립트를 작성한 다음 올바른 rc * .d 디렉토리에 심볼릭 링크를 만들어야합니다. 스크립트를 작성하는 가장 쉬운 방법은 이미 init.d에있는 스크립트를 검사하고 이해하는 사본을 만들고 사본을 수정하는 것입니다.

인셀덤 공식 판매점인 add서비스를 시작하려면 부팅 순서에서 적절한 위치를 선택했는지 확인하십시오. 서비스가 너무 빨리 시작되면 다른 서비스에 대한 종속성으로 인해 작동하지 않을 수 있습니다. 비 필수 서비스의 경우 대부분 systems administrators는 90년대의 숫자를 선호합니다. system.

Linux 배포판에는 일반적으로 rc * .d 디렉토리에서 서비스를 활성화 및 비활성화하는 명령이 함께 제공됩니다. 예를 들어 데비안에서 명령은 다음과 같습니다. update-rc.d 및 Red Hat에서 Linux, 명령은 chkconfig입니다. 그래픽 사용자 인터페이스도 사용할 수 있습니다. 이러한 프로그램을 사용하면 시작 디렉터리를 일관성 있게 유지하고 업그레이드하는 데 도움이 됩니다.

: 가장 일반적인 Linux installation 문제는 부적절하게 구성된 XFree86 서버입니다. system 콘솔에서는 사용할 수 없습니다. 이 동작을 중지하려면 단일 사용자로 부팅하십시오. mode 런레벨 또는 런레벨 서비스를 변경합니다. rc*.d 디렉토리 또는 /etc/inittab에서 xdm, gdm 또는 kdm이 포함된 항목을 찾습니다.

초기화 제어

때때로, 당신은 런레벨을 전환하거나, inittab 파일을 다시 읽거나, 그냥 shut down 전에, system. init는 항상 첫 번째 프로세스이기 때문에 system, 프로세스 ID는 항상 1입니다.

당신은 telinit init에 제어 할 수 있습니다. 당신이 런레벨 3로 전환하려는 경우 예를 들어, 다음 명령을 사용합니다 :

telinit 3

런레벨을 전환할 때 init는 새 런레벨에 대한 inittab 파일에 없는 모든 프로세스를 종료하려고 시도합니다. 따라서 런레벨 변경에 주의해야 합니다.

필요할 때 add 또는 재생성 작업을 제거하거나 inittab 파일에 다른 변경 사항을 적용하려면 변경 사항에 대해 init에 알리고 파일을 다시 읽도록 해야 합니다. 어떤 사람들은 kill -HUP 1을 사용하여 init에게 이렇게 하라고 지시합니다. 이 전통적인 방법은 올바르게 입력하는 한 대부분의 Unix 버전에서 작동합니다. 그러나 다음 telinit 명령을 실행할 수도 있습니다.

telinit q를

telinit s를 사용하여 단일 사용자로 전환할 수도 있습니다. mode.

종료

init는 또한 system 종료하고 재부팅합니다. 적절한 방법 shut down a Linux machine은 shutdown 명령을 사용하는 것입니다.

종료를 사용하는 두 가지 기본 방법이 있습니다. 중지하면 system, 그것은 종료 mac아래로 내리고 아래로 유지합니다. 만들기 위해 machine 중지 즉시 다음 명령을 사용하십시오.

종료 - H 기업

대부분 modern mac합리적으로 최신 버전의 Linux, 정지는 전원을 차단합니다. mac하인. 재부팅 할 수도 있습니다. mac하인. 재부팅하려면 -h 대신 -r을 사용하십시오.

종료 프로세스는 몇 초가 걸립니다. 재설정하거나 전원을 끄면 안됩니다. mac이 단계에서 하인.

앞의 예에서 지금은 shut down. 이 인수는 필수이지만이를 지정하는 방법에는 여러 가지가 있습니다. 원하는 경우 macHine이 미래의 언젠가는 다운되도록 하려면 + n을 사용하는 것이 한 가지 방법입니다. 여기서 n은 종료가 작업을 수행하기 전에 기다려야 하는 시간(분)입니다. 기타 options, shutdown (8) 매뉴얼 페이지를 보십시오.

를하기 위해 system 10 분 후에 재부팅하고 다음 명령을 실행합니다.

종료 - R + 10

On Linux, 종료는 로그온한 모든 사람에게 알립니다. machine이 다운되지만 실제 작업은 거의 수행되지 않습니다. 지금 이외의 시간을 지정하면 shutdown은 /etc/nologin이라는 파일을 생성합니다. 이 파일이 있으면 system 수퍼 유저를 제외한 누구의 로그인도 금지합니다.

인셀덤 공식 판매점인 system 셧다운 시간이 마침내 도착하면 shutdown은 init에게 중지를 위해 런레벨 0으로 전환하고 재부팅을 위해 런레벨 6으로 전환하도록 지시합니다. 초기화 할 때 enter런레벨 0 또는 6에서 다음이 모두 발생하며, rc0.d 및 rc6.d 내부의 스크립트를 보면 확인할 수 있습니다.

1. 초기화는 그것이 (다른 실행 레벨로 전환 할 때와는 것입니다) 수있는 모든 프로세스를 죽인다.

# 초기 rc0.d / rc6.d 명령 실행, 잠금 system 파일을 제자리에 배치하고 종료를 위한 기타 준비를 합니다.
# 다음 rc0.d/rc6.d 명령은 모든 파일을 마운트 해제합니다.system루트 이외의 s.
# 추가 rc0.d/rc6.d 명령은 루트 파일을 다시 마운트합니다.system 읽기 전용.
# 여전히 더 많은 rc0.d/rc6.d 명령은 버퍼링된 모든 데이터를 파일에 씁니다.system 동기화 프로그램으로.
# 마지막 rc0.d / rc6.d 명령은 부팅, 정지 또는 전원 끄기 프로그램을 재부팅하거나 중지 할 커널을 알려줍니다.

재부팅 및 중지 프로그램은 각 런레벨에 대해 다르게 작동하여 잠재적으로 혼동을 일으킬 수 있습니다. 으로 default, 이러한 프로그램은 -r 또는 -h를 사용하여 종료를 호출합니다. options,하지만 system 이미 중지 또는 재부팅 실행 수준에있는 경우 프로그램은 커널에 즉시 종료하도록 지시합니다. 당신이 정말로 당신을 닫고 싶다면 mac서둘러 내려 가려면 (무질서한 종료로 인한 손상 가능성 무시) -f 옵션을 사용하십시오.

기술 애호가로서, 2006년부터 StealthSettings.com에서 기쁨을 가지고 글을 쓰고 있습니다. macOS, Windows, Linux 등 다양한 운영 체제에 대한 풍부한 경험이 있으며 프로그래밍 언어 및 블로깅 플랫폼 (WordPress)과 같은 분야에도 정통하고 있습니다. 온라인 스토어 (WooCommerce, Magento, PrestaShop)를 포함하여 여러 분야에서 경험이 있습니다.

코멘트 남김