Nhân Linux có cần một hệ thống tập tin để chạy không?


19

Ý kiến ​​của tôi là có, bởi vì tất cả các tiếp xúc hữu ích với thế giới bên ngoài (chế độ bộ xử lý không đặc quyền) trước tiên sẽ yêu cầu một quá trình chạy ở thế giới bên ngoài. Điều đó sẽ yêu cầu một hệ thống tệp, thậm chí là hệ thống tệp tạm thời, trong RAM.

Một kỹ sư khác không đồng ý với tôi, nhưng dường như tôi không thể chứng minh điều này vượt ra ngoài tất cả các trường hợp (không biết với tôi).

Câu trả lời cho câu hỏi này có phụ thuộc vào định nghĩa của 'chạy' không?


4
tôi nghĩ rằng một kernel đang chạy không "yêu cầu"useful exposure to the outside world
jsotola

19
Mang đến tâm trí tường lửa Linux đã tạm dừng cũ (khoảng năm 2002)
Jeff Schaller

1
Nếu bạn thêm mã mới vào kernel, bạn có thể làm bất cứ điều gì. Nếu bạn không thể, nó sẽ khởi tạo tốt cho đến khi nó cố gắng chạy init(quá trình không gian người dùng đầu tiên) và điều đó sẽ thất bại.
dùng253751

1
Xác định "chạy" ...
Thorbjørn Ravn Andersen

Câu trả lời:


27

Đó là một câu hỏi kỳ lạ bởi vì bạn không chạy kernel giống như bạn chạy một chương trình. Kernel là một nền tảng để chạy các chương trình trên. Tất nhiên là có mã cài đặt và tắt máy nhưng không thể tự chạy kernel. Luôn phải có một quá trình "init" chính. Và hạt nhân sẽ hoảng loạn nếu nó không ở đó. Nếu init cố gắng thoát kernel cũng sẽ hoảng loạn.

Ngày nay, quá trình init là một cái gì đó giống như systemd. Nếu không được chỉ định khác, kernel sẽ cố chạy một chương trình từ danh sách các vị trí bắt đầu bằng /sbin/init. Xem init Param tại đây http://man7.org/linux/man-pages/man7/bootparam.7.html trong trường hợp khẩn cấp bạn có thể khởi động Linux với init=/bin/bash. Nhưng hãy chú ý cách bạn luôn chỉ định một tệp trên hệ thống tệp để chạy.

Vì vậy, kernel sẽ hoảng loạn nếu nó khởi động không có hệ thống tập tin vì không có ai thì không có cách nào để tải init.

Một số nhầm lẫn có thể phát sinh do tình huống gà và trứng trong đó hạt nhân phải tải trình điều khiển để truy cập hệ thống tệp của nó. Để hoàn thành điều này, một ramdisk ban đầu được tải từ một hình ảnh trên đĩa chứa các trình điều khiển quan trọng và các tập lệnh thiết lập. Chúng được thực thi trước khi hệ thống tập tin được tải. Nhưng không có lỗi, ramdisk ban đầu là một hệ thống tập tin. Với một ramdisk ban đầu /initđược gọi (được lưu trữ trên ramdisk ban đầu). Trong nhiều bản phân phối, cuối cùng cái này gọi là /sbin/init. Một lần nữa không có hệ thống tập tin, điều này là không thể.


Không có điều kiện mà kernel từ bỏ việc cố gắng khởi tạo phần cứng và tải một hệ thống tệp đã biết (không phải initrd được truyền vào kernel thông qua init params), sau đó rơi vào một vỏ rất hạn chế (không có init = / bin / bash)? Ngoài ra, vì bạn đưa lên / bin / bash, kernel luôn có sẵn hệ thống tệp tối thiểu đó, ngay cả khi nó được xây dựng với các tùy chọn .config khác có khả năng loại bỏ điều này?
Peter L.

1
@PeterL. shell giới hạn đó là một số shell từ initrd / initramfs / bất cứ thứ gì mà kernel đã khởi động, IIRC.
muru

3
Lưu ý rằng bạn có thể xây dựng initramfs (kho lưu trữ CPIO được trích xuất thành hệ thống tập tin ramfs hoặc tmpfs) vào kernel. Việc có được tính là kernel "cần một hệ thống tập tin" hay không là tùy thuộc vào bạn, vì điều đó có nghĩa là bạn có thể khởi động kernel và không có gì ngoài kernel và có hệ thống chức năng (nếu bị giới hạn một chút). Cũng lưu ý rằng, ngay cả khi bạn vá kernel không còn yêu cầu init, nó vẫn sẽ tạo ra các hệ thống tệp ảo bên trong không bao giờ bị lộ.
rừng

@forest Hệ thống không phải bị "giới hạn" - bạn có thể đóng gói systemd và gnome vào initrd của mình (cùng với những thứ thực sự hữu ích ;-)). Một hạn chế của initramfs là (vẫn là?) Rằng nó không hỗ trợ các thuộc tính mở rộng - Tôi đã làm việc xung quanh nó trên Android bằng cách đưa hình ảnh ext4 vào kho lưu trữ cpio sau đó được gắn dưới dạng thiết bị lặp từ init.$DEV.rctập lệnh.
Chú Billy

1
@IsmaelMiguel, không, một initramfs như vậy là một kho lưu trữ cpio. Squashfs là một lựa chọn tốt cho các hệ thống tệp nhúng và người ta có thể tạo một initrd (so với initramfs) sử dụng nó (các thuật ngữ thường được sử dụng thay thế cho nhau nhưng chúng không hoàn toàn giống nhau), nhưng đó không phải là định dạng mà Linux giải nén vào khởi xướng. (Thật vậy, một hình ảnh squashfs không cần phải giải nén trước khi nó có thể được sử dụng; nó được lập chỉ mục chính xác).
Charles Duffy

16

Câu trả lời sẽ phụ thuộc vào việc bạn thực sự có nghĩa là không có hệ thống tập tin hay nếu câu hỏi được dự định sẽ được giải thích một chút khác biệt so với cách nó được nêu thực sự. Các câu trả lời cho các thay đổi nhỏ trong cách giải thích câu hỏi là:

  • Chạy Linux mà không có bất kỳ thiết bị khối nào là hoàn toàn khả thi và hữu ích cho một số trường hợp sử dụng chuyên biệt.
  • Chạy Linux mà không có bất kỳ hệ thống tệp nào sẽ yêu cầu viết lại một số phần của mã hạt nhân và nó không chắc là một nỗ lực hữu ích.
  • Chạy Linux mà không sử dụng bất kỳ mô tả tệp nào sẽ đòi hỏi rất nhiều nỗ lực. Tôi khá chắc chắn rằng điều đó sẽ không đáng để nỗ lực.

Những lý do bạn phải viết lại các phần của mã hạt nhân để tạo ra một hệ thống làm việc không có hệ thống tệp là:

  • Mỗi luồng có một thư mục gốc và một thư mục làm việc hiện tại phải trỏ đến một số hệ thống tệp.
  • Các chương trình được bắt đầu bằng lệnh execvegọi hệ thống cần thực thi từ hệ thống tệp.
  • Nhân tạo một hệ thống tệp dựa trên bộ nhớ trong quá trình khởi động.

Sau khi một chương trình đã được bắt đầu sử dụng, execvenó có thể hủy sơ đồ thực thi mà nó đã được khởi động, mặc dù vậy, để làm như vậy mà không bị sập ngay lập tức, trước tiên phải tạo một ánh xạ bộ nhớ thực thi không được hỗ trợ bởi một tệp, và nó phải khởi tạo nó với một số mã hữu ích trước khi nhảy tới nó và hủy ánh xạ thực thi.

Do đó, một chương trình chế độ người dùng đang chạy có thể tồn tại ở trạng thái không có ánh xạ bộ nhớ được hỗ trợ bởi các tệp và nó có thể đóng tất cả các mô tả tệp được hỗ trợ bởi các tệp. Nó không thể ngừng có một thư mục gốc và thư mục làm việc hiện tại, nhưng nó có thể kiềm chế những thư mục đó.

Vì vậy, mặc dù trong trạng thái này, bạn có thể triển khai mã hạt nhân để tách hệ thống tệp ra khỏi chương trình và để nó tiếp tục chạy, nhưng nó không có vẻ như nó hữu ích. Và đi vào trạng thái cuối cùng mà không trải qua trạng thái trung gian sử dụng hệ thống tệp sẽ còn làm việc nhiều hơn mà không có lợi ích hữu ích.

Một thiết lập hữu ích cho một số trường hợp sử dụng chuyên biệt

Tránh sử dụng các thiết bị khối có thể hữu ích. Trong quá trình khởi động, kernel tạo ra một hệ thống tệp bộ nhớ và nó cũng có thể tạo ra hệ thống tệp đó với nội dung từ cpiokho lưu trữ trước khi thực hiện init. Bằng cách đó, bạn có thể chạy một hệ thống hoàn toàn từ một hệ thống tệp dựa trên bộ nhớ mà không cần bất kỳ thiết bị chặn nào để sao lưu nó.

Điều này có thể hữu ích cho các hệ thống mà bạn không muốn duy trì bất kỳ trạng thái nào và như hệ thống bắt đầu từ một bảng xếp hạng sạch khi khởi động lại.

Tất nhiên, kho lưu trữ kernel và cpio phải tồn tại bằng cách nào đó tồn tại trong bộ nhớ trước khi kernel được kiểm soát. Làm thế nào họ có được một công việc cho bộ tải khởi động. Bộ tải khởi động có thể đã tải những thứ đó từ một thiết bị khối mặc dù hệ thống đang chạy cuối cùng không sử dụng các thiết bị khối. Nhưng bộ tải khởi động cũng có thể có được kho lưu trữ kernel và cpio mà không cần sử dụng thiết bị chặn chẳng hạn bằng cách khởi động qua mạng.


1
Câu hỏi đặt ra là liệu hạt nhân Linux trong bất kỳ cấu hình được xây dựng nào (không cần viết lại bất cứ thứ gì) có thể 'chạy' mà không cần bất kỳ hệ thống tệp nào. Nó không phải làm bất cứ điều gì hữu ích hoặc bảo tồn một trạng thái. Từ tất cả các câu trả lời, tôi hiểu rằng một số loại hệ thống tệp được cung cấp và giả định trong chính hạt nhân, ít nhất là cho đến khi tắt máy. Thậm chí '/' là một hệ thống tập tin. Vì vậy, tôi nghĩ để đơn giản hóa câu trả lời là 'có'.
Peter L.

2
@PeterL. Có, nếu bạn không viết lại bất cứ điều gì Linux sẽ yêu cầu một hệ thống tệp. Khi mọi người nói về việc sử dụng thực tế cho Linux mà không có hệ thống tệp, họ thường sẽ đề cập đến những ứng dụng được hỗ trợ bởi một thiết bị khối và bạn có thể chạy Linux mà không cần hệ thống tệp được hỗ trợ bởi thiết bị khối. Bạn vẫn sẽ có một số loại hệ thống tập tin.
kasperd

3

Trong Linux, gần như mọi thiết bị đều là một tệp , vì vậy bạn phải có một hệ thống tệp để chạy nó.


8
Nhưng tất nhiên các trình điều khiển thiết bị tồn tại bên trong kernel bất kể tập tin thiết bị có trỏ đến chúng hay không.
Philip Couling

6
Không phải mọi thiết bị là một tập tin. Giao diện mạng ( eth0, wlan0vv) là không, ví dụ.
Ruslan

1
Đây là một quan niệm sai lầm phổ biến. Về lý thuyết, mọi thứ đều là một tệp trong các hệ thống giống như UNIX và UNIX, nó chỉ hoàn toàn đúng đối với các hệ thống chuyên dụng cao như Plan 9 (mặc dù nó đúng hơn nhiều so với Windows). Đối với Linux, khá nhiều thứ không phải là tệp. Điều này ngày càng đúng hơn khi nhiều trình điều khiển đã bắt đầu sử dụng netlink thay vì ioctls trên các thiết bị ký tự ( các tệp).
rừng

@forest Plan 9 không phải là một hệ thống "chuyên môn cao" - nó được cho là một hệ thống có mục đích chung như Unix hoặc windows (tại sao nó thất bại trong việc thay thế Unix và vẫn là một hệ thống nghiên cứu là một câu chuyện hoàn toàn khác). Dù sao, giống như Linux, plan9 đang phơi bày các giao diện ảo hóa cho phần cứng của nó (và không có bất kỳ ioctls nào - Tôi không thấy cách sử dụng yếu tố netlink so với ioctls trong tất cả điều này), ngay cả khi nó cố gắng để phù hợp hơn (ví dụ: các giao diện mạng có thể truy cập thông qua hệ thống tập tin). Với sự ra đời của các không gian tên, Linux đã giống plan9 hơn là unix cổ điển.
Chú Billy

1
Đối số rất hay: có devfs, là một hệ thống tệp theo định nghĩa hoặc không có devfs, trong trường hợp đó bạn cần một hệ thống tệp để lưu trữ các nút thiết bị ...
pmf

-1

Một hạt nhân là một chương trình, giống như bất kỳ chương trình nào khác. Theo mặc định, nhân Linux cố gắng truy cập hệ thống tệp, tuy nhiên hành vi này có thể được loại bỏ một cách tầm thường bằng sửa đổi nhân (thực ra chỉ là bổ sung chức năng "arch_call_rest_init ()"). Để thực hiện "công việc hữu ích", chúng tôi hy vọng rằng nhà phát triển có thể bao gồm các luồng nhân (kthreads), perhapos trong trình điều khiển tùy chỉnh, để thực hiện một số công việc khởi tạo và loại ứng dụng mong muốn. Nhân Linux đã chứa nhiều kthread, nhưng chủ yếu để thực hiện công việc phụ trợ cho kernel hoặc trình điều khiển. Các API có sẵn trong ngữ cảnh kernel khá khác so với các API có sẵn trong không gian người dùng Linux. Một phần lớn chức năng gọi hệ thống sẽ trở nên vô dụng trong kịch bản không có hệ thống tập tin.

Có, Linux dự kiến ​​truy cập vào các hệ thống tệp theo mặc định. Không, một hạt nhân được sửa đổi chắc chắn có thể được tạo ra để thực hiện công việc hữu ích với bất kỳ hệ thống tệp nào. Việc sử dụng thực tế của hệ thống tập tin Linux w / o là IMO khá hạn chế, nhưng không phải là con số không. FWIW, trong quá khứ, nhiều hạt nhân thời gian thực đã được tích hợp vào cùng một không gian tên & nhị phân như các ứng dụng RT.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.