Linux 커널을 실행하려면 파일 시스템이 필요합니까?


19

외부 세계 (비 권한 프로세서 모드)에 대한 모든 유용한 노출은 먼저 외부 세계에서 실행되는 프로세스를 필요로하기 때문에 제 의견은 그렇습니다. 이를 위해서는 파일 시스템, 심지어 임시 RAM 내 파일 시스템이 필요합니다.

다른 엔지니어가 동의하지 않지만 모든 (나에게 알려지지 않은) 경우를 넘어서는 이것을 증명할 수없는 것 같습니다.

이 질문에 대한 대답은 '실행 중'의 정의에 달려 있습니까?


4
나는 실행중인 커널이 "필수"하지 않는다고 생각한다useful exposure to the outside world
jsotola

19
오래된 중지 된 Linux 방화벽 (2002 년경) 을 생각 나게합니다
Jeff Schaller

1
커널에 새 코드를 추가하면 무엇이든 할 수 있습니다. 만약 당신이 그것을 할 수 없다면, 그것이 실행을 시도 할 때까지 init(첫번째 사용자 공간 프로세스) 잘 초기화 될 것이고, 그것은 실패 할 것입니다.
user253751

1
"실행"을 정의합니다 ...
Thorbjørn Ravn Andersen

답변:


27

프로그램을 실행하는 것처럼 커널을 실행하지 않기 때문에 다소 이상한 질문입니다. 커널은 프로그램을 실행하는 플랫폼입니다. 물론 설정 및 종료 코드가 있지만 커널을 자체적으로 실행할 수는 없습니다. 항상 기본 "init"프로세스가 있어야합니다. 커널이 없으면 패닉 상태가됩니다. init가 종료하려고하면 커널도 패닉 상태가됩니다.

요즘 초기화 과정은 systemd와 비슷합니다. 달리 지정하지 않으면 커널은로 시작하는 위치 목록에서 프로그램을 실행하려고 시도합니다 /sbin/init. 리눅스를 부팅 할 수있는 응급 상황 에서 http://man7.org/linux/man-pages/man7/bootparam.7.html init Param을 참조하십시오 init=/bin/bash. 그러나 항상 파일 시스템에서 실행할 파일을 지정하는 방법에 유의하십시오.

따라서 커널이 파일 시스템을 시작하지 않으면 패닉 상태가됩니다. 파일 시스템이 없으면 init을로드 할 방법이 없기 때문입니다.

커널이 파일 시스템에 액세스하기 위해 드라이버를로드해야하는 닭과 달걀 상황으로 인해 약간의 혼란이 발생할 수 있습니다. 이를 해결하기 위해 초기 램 디스크는 중요한 드라이버와 설정 스크립트가 포함 된 디스크의 이미지에서로드됩니다. 파일 시스템이로드되기 전에 실행됩니다. 그러나 초기 램 디스크 자체가 파일 시스템이라는 것은 실수가 아닙니다. 초기 램 디스크 /init가 호출됩니다 (초기 램 디스크에 저장 됨). 많은 배포판에서 궁극적으로 이것이 호출 /sbin/init됩니다. 파일 시스템이 없으면 다시 불가능합니다.


커널이 하드웨어 초기화 시도를 포기하고 알려진 파일 시스템을로드하는 (initrd가 init 매개 변수를 통해 커널로 전달되지 않음) 조건이 없는가 (init = / bin / bash없이) 매우 제한된 쉘로 드롭됩니까? 또한 / bin / bash를 불러 오기 때문에 잠재적으로 이것을 제거 할 수있는 다른 .config 옵션으로 빌드하더라도 커널은 항상 최소 파일 시스템을 사용할 수 있습니까?
피터 L.

1
@PeterL. 그 제한 쉘은 initrd / initramfs / 커널이 부팅 한 IIRC의 쉘입니다.
muru

3
initramfs (ramfs 또는 tmpfs 파일 시스템으로 추출 된 CPIO 아카이브) 커널에 빌드 할 수 있습니다 . 커널이 "파일 시스템을 필요로하는"것으로 간주하는지 여부는 커널을 부팅 할 수 있고 커널 만 작동하고 기능적인 (비트가 제한적인 경우) 시스템을 가질 수 있기 때문입니다. 또한 더 이상 init가 필요하지 않도록 커널을 패치하더라도 노출되지 않은 내부 가상 파일 시스템 이 계속 생성됩니다 .

@forest 시스템은 "제한적"일 필요는 없습니다. 시스템과 그놈을 initrd에 넣을 수 있습니다 (실제로 유용한 ;-)). initramfs에 하나의 한계는 (아직?)했다가 확장 된 속성을 지원하지 않는 것을 - 내가 했던 다음에서 루프 장치로 장착 된 initrd를 CPIO 아카이브에서 ext4에 이미지를 포함하여 안드로이드에 주위 작업 init.$DEV.rc스크립트를.
Billy

1
@IsmaelMiguel, 아니, initramfs는 cpio 아카이브입니다. SquashFS는 임베디드 파일 시스템을위한 좋은 선택입니다, 하나는 (AN 다시 initramfs 대)가 initrd를 만들 수 사용이 (용어가 자주 교환 할 사용하지만 그들은하지 않은 것을 확실히 같은 것)하지만, 리눅스 압축이에 형식이 아니다 그 initramfs. (실제로, squashfs 이미지는 전혀 사용하기 전에 압축을 풀 필요가 없습니다; 올바르게 색인화됩니다).
Charles Duffy

16

답은 파일 시스템없이 문자 그대로 의미하는지 또는 질문이 실제로 언급 된 방식과 약간 다르게 해석되는지 여부에 따라 달라집니다. 질문 해석 방식의 약간의 변형에 대한 답변은 다음과 같습니다.

  • 블록 장치 없이 Linux를 실행하는 것은 전적으로 실행 가능하며 일부 특수 사용 사례에 유용합니다.
  • 파일 시스템 없이 Linux를 실행 하려면 커널 코드의 일부를 다시 작성해야하며 유용한 노력이 아닐 수 있습니다.
  • 파일 디스크립터 를 사용하지 않고 Linux를 실행 하려면 많은 노력이 필요합니다. 나는 그 노력의 가치가 없을 것이라고 확신합니다.

파일 시스템없이 작동하는 시스템을 만들기 위해 커널 코드의 일부를 다시 작성해야하는 이유는 다음과 같습니다.

  • 모든 스레드에는 루트 디렉토리와 일부 파일 시스템을 가리켜 야하는 현재 작업 디렉토리가 있습니다.
  • 프로그램은 execve파일 시스템에서 실행 파일이 필요한 시스템 호출 로 시작됩니다 .
  • 커널은 부팅 과정에서 메모리 기반 파일 시스템을 만듭니다.

프로그램을 사용하여 시작한 후에는 프로그램이 시작된 execve실행 파일을 매핑 해제 할 수 있지만, 즉시 충돌하지 않고 실행하려면 먼저 파일에 의해 지원되지 않는 실행 가능 메모리 매핑을 만들어야합니다. 점프하고 실행 파일을 매핑 해제하기 전에 유용한 코드로 초기화해야합니다.

따라서 실행중인 사용자 모드 프로그램은 파일이 지원하는 메모리 맵핑이없는 상태에 존재할 수 있으며 파일이 지원하는 모든 파일 디스크립터를 닫을 수 있습니다. 루트 디렉토리와 현재 작업 디렉토리를 가질 수는 없지만 그 디렉토리를 자제 할 수 있습니다.

따라서이 상태에서 커널 코드를 구현하여 파일 시스템을 프로그램에서 멀리 가져 와서 계속 실행할 수는 있지만 유용한 것처럼 들리지 않습니다. 그리고 파일 시스템을 사용하는 중간 상태를 거치지 않고 해당 최종 상태로 들어가는 것은 아무런 이점이없는 더 많은 작업이 될 것입니다.

일부 특수 사용 사례에 유용한 설정

블록 장치 사용을 피하는 것이 유용 할 수 있습니다. 부팅하는 동안 커널은 메모리 파일 시스템을 만들고, cpio실행하기 전에 해당 파일 시스템을 아카이브의 내용으로 채울 수도 있습니다 init. 이렇게하면 블록 장치없이 메모리 기반 파일 시스템에서 시스템을 완전히 실행할 수 있습니다.

이는 상태를 유지하지 않으려는 경우 및 재부팅시 시스템이 클린 슬레이트에서 시작하는 것과 같은 시스템에 유용 할 수 있습니다.

물론 커널과 cpio 아카이브는 커널에 제어권이 부여되기 전에 어떻게 든 메모리에 존재해야합니다. 그들이 어떻게 부트 로더를위한 일을했는지. 최종 실행 시스템이 블록 장치를 사용하지 않더라도 부트 로더는 블록 장치에서 해당 장치를로드 할 수 있습니다. 그러나 부트 로더가 네트워크를 통해 부팅하는 등의 블록 장치를 사용하지 않고 커널 및 cpio 아카이브를 얻을 수도 있습니다.


1
문제는 빌드 된 구성의 Linux 커널 (아무것도 다시 쓰지 않고)이 파일 시스템없이 '실행'될 수 있는지입니다. 유용한 것을하거나 상태를 보존 할 필요는 없습니다. 모든 대답에서, 적어도 일종의 파일 시스템이 적어도 종료 될 때까지 커널 자체에서 제공되고 가정 된다는 것을 이해하고 있습니다 . '/'조차도 파일 시스템입니다. 그래서 나는 대답이 '예'라고 단순화하려고 생각합니다.
피터 L.

2
@PeterL. 예, 아무것도 다시 쓰지 않으면 Linux에 파일 시스템이 필요합니다. 사람들이 파일 시스템없이 리눅스를 실제로 사용하는 것에 대해 이야기 할 때, 그들은 일반적으로 블록 장치가 지원하는 것들을 참조 할 것이며, 블록 장치가 지원하는 파일 시스템없이 리눅스를 실행할 수 있습니다. 여전히 일종의 파일 시스템이 있습니다.
kasperd

3

Linux에서 거의 모든 장치는 파일 이므로 실행하려면 파일 시스템이 있어야합니다.


8
그러나 장치 파일이 장치 파일을 가리키는 지 여부에 관계없이 장치 드라이버는 커널 내부에 존재합니다.
Philip Couling

6
모든 장치가 파일 인 것은 아닙니다. 네트워크 인터페이스 ( eth0, wlan0등), 예를 들면 아니다.
Ruslan

1
이것은 일반적인 오해입니다. 이론적으로 모든 것이 UNIX 및 UNIX 계열 시스템의 파일이지만 계획 9와 같은 고도로 전문화 된 시스템의 경우에만 해당됩니다 (Windows보다 훨씬 그렇습니다). 리눅스의 경우, 파일이 아닌 것들이 꽤 있습니다. 많은 드라이버를 사용 넷 링크가 아닌 문자 장치의 ioctl (하기 시작했다 이것은 점점 더 진정한지고 있습니다 파일).

@forest Plan 9는 "매우 특수화 된"시스템이 아닙니다. Unix 나 Windows와 같은 범용 시스템이어야합니다 (Unix를 대체하지 못하고 연구 시스템으로 남아있는 이유는 완전히 다른 이야기입니다). 어쨌든, Linux와 마찬가지로 plan9는 하드웨어에 가상화 된 인터페이스를 노출시키고 있습니다 (그리고 ioctl이 없습니다). 네트워크 인터페이스는 파일 시스템을 통해 액세스 할 수 있습니다). 네임 스페이스가 도입되면서 리눅스는 이미 기존 유닉스보다 plan9와 비슷합니다.
Billy

1
아주 좋은 주장 : 정의 당 파일 시스템 인 devfs가 있거나 devfs가없는 경우, 장치 노드를 호스트하기위한 파일 시스템이 필요합니다.
pmf

-1

커널은 다른 프로그램과 마찬가지로 프로그램입니다. 기본적으로 리눅스 커널은 파일 시스템에 접근하려고 시도하지만,이 동작은 커널 수정 (실제로는 "arch_call_rest_init ()"함수의 추가)에 의해 제거 될 수 있습니다. "유용한 작업"을 수행하기 위해 개발자는 원하는 초기화 및 응용 프로그램 유형 작업 부하를 수행하기 위해 사용자 지정 드라이버에 perhapos 인 커널 스레드 (kthread)를 포함 할 수있을 것으로 기대합니다. Linux 커널에는 이미 많은 kthread가 포함되어 있지만 주로 커널이나 드라이버에 대한 보조 작업을 수행합니다. 커널 컨텍스트 내에서 사용 가능한 API는 Linux 사용자 공간에서 사용 가능한 API와 상당히 다릅니다. 파일 시스템없는 시나리오에서는 시스템 호출 기능의 상당 부분이 쓸모 없게됩니다.

예, Linux는 기본적으로 파일 시스템에 액세스 할 것으로 예상합니다. 아니요, 파일 시스템없이 유용한 작업을 수행하도록 수정 된 커널을 만들 수 있습니다. 파일 시스템없이 리눅스를 실제로 사용하는 것은 IMO가 상당히 제한적이지만 전혀 아니다. FWIW는 과거에 많은 실시간 커널이 RT 애플리케이션과 동일한 네임 스페이스 및 바이너리로 구축되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.