Làm cách nào tôi có thể tạo ra bản phân phối Linux "tùy chỉnh" của riêng mình, nó sẽ chỉ chạy một chương trình, khá giống với XBMCbfox .
Làm cách nào tôi có thể tạo ra bản phân phối Linux "tùy chỉnh" của riêng mình, nó sẽ chỉ chạy một chương trình, khá giống với XBMCbfox .
Câu trả lời:
Tôi sẽ không bắt đầu gây rối với LFS, đó là một con đường trong vườn dẫn đến một số khu rừng tối.
Bắt đầu với một bản phân phối nơi bạn có nhiều quyền kiểm soát cài đặt ban đầu, chẳng hạn như Arch hoặc phiên bản không đầu như máy chủ Ubuntu. Điểm của điều này là không quá nhiều để tiết kiệm không gian để phân định sự phức tạp của cấu hình init; bắt đầu từ một bản phân phối không đầu, nếu ứng dụng bạn muốn chạy yêu cầu GUI, bạn có thể thêm những gì cần thiết cho việc đó mà không phải kết thúc bằng đăng nhập GUI (còn gọi là trình quản lý hiển thị hoặc DM) được khởi động bởi init và máy tính để bàn đầy đủ môi trường để đi với nó.
Sau đó, bạn muốn tìm hiểu cách định cấu hình hệ thống init theo mục đích của mình - lưu ý rằng bạn không thể làm gì nếu không có init và đó có thể là phương tiện tốt nhất để thực hiện mục tiêu của bạn. Có ba biến thể trên init thường được sử dụng trên linux (nhưng có một số biến thể khác ):
Debian sử dụng một biến thể trên init kiểu SysV Unix cổ điển . Kể từ khi jessie
phát hành, Debian cũng đã chuyển sang systemd
( https://wiki.debian.org/systemd )
Ubuntu và các dẫn xuất sử dụng mới nhất .
Fedora, Arch và các dẫn xuất sử dụng systemd .
Nếu bạn chưa biết gì về bất kỳ thứ nào trong số này, thì không ai trong số chúng đặc biệt khó sử dụng hơn bất kỳ thứ nào trong số này. Nếu bạn đi với một trong hai cái sau, chúng sẽ cung cấp một số cơ chế để tương thích ngược với SysV, nhưng đừng bận tâm về điều đó , nó KHÔNG đơn giản hơn. 1
Vấn đề ở đây là giảm thiểu những gì init làm khi khởi động và đó là cách bạn có thể tạo một hệ thống sẽ chạy một lượng phần mềm tối thiểu để hỗ trợ ứng dụng bạn muốn tập trung vào - đây thực chất là cách máy chủ được thiết lập, BTW, do đó, đây là một nhiệm vụ chung (lưu ý rằng bạn thực sự không thể có "chỉ một" quy trình người dùng đang chạy, ít nhất là không hữu ích).
Nếu ứng dụng bạn muốn chạy là một chương trình GUI (một ví dụ điển hình về lý do tại sao bạn không thể chỉ chạy một ứng dụng, vì các ứng dụng GUI yêu cầu máy chủ X), bạn có thể có một ứng dụng ~/.xinitrc
giống như thế này;
#!/bin/sh
myprogram
Khi đó startx
, chương trình của bạn sẽ là thứ duy nhất đang chạy và sẽ không thể thay đổi máy tính để bàn hoặc khởi động bất cứ thứ gì khác, một phần vì không có trình quản lý cửa sổ hoặc môi trường máy tính để bàn (do đó, sẽ không có khung cửa sổ hoặc thanh tiêu đề).
1. Để hiểu rõ vấn đề một chút: Khi bạn đang nghiên cứu vấn đề này, bạn có thể thấy một chút hiểu biết về systemd và mới bắt đầu từ những người trước đây quen thuộc với tuyên bố của SysV, ví dụ, họ quá phức tạp. Tuy nhiên, về mặt khách quan, chúng không phức tạp hơn SysV (trên thực tế, hệ thống IMO đơn giản hơn để sử dụng), nhưng hầu hết các con chó thích các thủ thuật cũ của chúng, có thể nói như vậy. Sự kìm kẹp này đang bắt đầu tàn lụi bây giờ cả hai hệ thống đã được sử dụng trong một thời gian.
init
nhưng chắc chắn bạn có thể làm mà không upstart, systemd,
hay sysv. init
chỉ là một số tập tin thực thi đặt tên init
mà gọi kernel của bạn khi nó gắn kết initramfs.
Trong hầu hết các trường hợp, những ba người kia thậm chí không init
nhưng họ đang thực sự exec
ed vào bởi init,
đó thườngbusybox.
busybox
vì điều đó xứng đáng được đối xử riêng biệt trong một câu trả lời riêng biệt, nhưng không phải bởi tôi.
Tối thiểu init chương trình thế giới từng bước
Biên dịch một thế giới xin chào mà không có bất kỳ sự phụ thuộc nào kết thúc trong một vòng lặp vô hạn. init.S
:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
Chúng tôi không thể sử dụng lệnh gọi hệ thống thoát, hoặc nếu không thì kernel hoảng loạn.
Sau đó:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Điều này tạo ra một hệ thống tập tin với thế giới xin chào của chúng tôi /init
, đây là chương trình người dùng đầu tiên mà kernel sẽ chạy. Chúng tôi cũng có thể đã thêm nhiều tệp vào d/
và chúng có thể truy cập được từ /init
chương trình khi kernel chạy.
Sau đó cd
vào cây nhân Linux, xây dựng như bình thường và chạy nó trong QEMU:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
Và bạn sẽ thấy một dòng:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
trên màn hình giả lập! Lưu ý rằng nó không phải là dòng cuối cùng, vì vậy bạn phải nhìn xa hơn một chút.
Bạn cũng có thể sử dụng các chương trình C nếu bạn liên kết chúng tĩnh:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
với:
gcc -static init.c -o init
Liên kết động sẽ yêu cầu thiết lập một trình liên kết động thực thi, phổ biến nhất trong số đó là một phần của các thư viện chuẩn C như glibc.
Bạn có thể chạy trên phần cứng thực với bật USB /dev/sdX
và:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Nguồn tuyệt vời về chủ đề này: Mẹo công nghệ: Cách sử dụng initramfs | Landley.net Nó cũng giải thích cách sử dụng gen_initramfs_list.sh
, đó là một tập lệnh từ cây nguồn Linux để giúp tự động hóa quy trình.
Đã thử nghiệm trên Ubuntu 16.10, QEMU 2.6.1.
Bước tiếp theo
Điều tiếp theo bạn muốn làm là thiết lập BusyBox .
BusyBox triển khai các tiện ích POSI-y CLI cơ bản, bao gồm cả vỏ POSIX-y, cho phép bạn dễ dàng thử nghiệm hệ thống hơn với hệ thống.
Cá nhân, tại thời điểm này tôi thích chỉ dựa vào Buildroot , đây là một tập lệnh tuyệt vời tự động hóa việc xây dựng mọi thứ từ nguồn và tạo hệ thống tập tin gốc.
Tôi đã tải lên một trình trợ giúp rất chi tiết và tự động cho điều đó tại: https://github.com/cirosantilli/linux-kernel-module-cheat
nếu bạn có chút ít về lập trình và bạn muốn tạo nó từ đầu, bạn có thể dùng LFS tức là Linux từ Scratch http://www.linuxfromscratch.org/
Nếu bạn muốn tùy chỉnh ubutnu, bạn có thể sử dụng ubunt-builder và nếu bạn muốn nó trên cơ sở vòng / phút, bạn có thể sử dụng SUsE-Studio, studio Suse sẽ cho phép bạn tạo linux suse tùy chỉnh
chúc mừng
Nó là nhiều hơn về những gì "một chương trình" của bạn yêu cầu.
Bạn vẫn có thể có một khởi đầu tốt để hiểu cách kết hợp mọi thứ bằng cách xây dựng một LFS (còn gọi là " Linux từ đầu ") . Sau đó, bạn sẽ thêm những thứ mà chương trình của bạn yêu cầu hoặc phân phối đầy đủ vì việc xây dựng hệ thống con nặng như Gnome hoặc KDE trên LFS có thể là một thử thách thực sự.
Tất nhiên việc đi lùi có thể dễ dàng hơn lúc đầu, nhưng loại bỏ mọi thứ khỏi một bản phân phối đầy đủ có thể gây rắc rối: làm điều này trong một VM và sao chép VM này ở mỗi bước.
(2 xu của tôi)
Chỉnh sửa :
Như SecurityBeast đã chỉ ra thay vì bắt đầu từ một bản phân phối đầy đủ như CentOS hoặc Ubuntu , bạn cũng có thể xem xét việc xây dựng các công cụ phân phối như:
Những gì bạn cần hỏi là "một chương trình" của bạn cần gì và bạn có tài nguyên gì.
Nếu nó cần nhiều lựa chọn thư viện và nhị phân hỗ trợ, bạn có thể sử dụng một bản phân phối linux "thông thường" (Debian hoặc tương tự) và chỉ làm rối quá trình khởi động một chút.
Nếu nó cần một lựa chọn hẹp hơn cho các công cụ hỗ trợ nhưng vẫn yêu cầu các công cụ như kết nối mạng hoặc hỗ trợ cho nhiều loại phần cứng khác nhau bằng cách sử dụng các mô-đun hạt nhân hoặc các bit hỗ trợ người dùng khác nhau và bạn không muốn sử dụng không gian đĩa của một bản phân phối thông thường thì tôi khuyên bạn nên xem xét các bản phân phối được nhúng (buildroot hoặc tương tự) hoặc có thể là một linux từ phương pháp tiếp cận đầu (mặc dù đó có thể là một vấn đề đau đầu về bảo trì)
Nếu bạn chỉ cần những gì một hạt nhân không mô-đun có thể cung cấp và không có gì khác thì việc chạy thẳng nhị phân của riêng bạn trên hạt nhân có thể hoạt động và là giải pháp nhẹ nhất ..
busybox
nhưng đó có lẽ không phải là điều bạn muốn. vì vậy xin vui lòng, dành thời gian cần thiết để bày tỏ nhu cầu của bạn và chúng tôi có thể giúp bạn. Đừng ngần ngại chỉnh sửa câu hỏi của bạn để thêm bất kỳ yếu tố liên quan nào trong đó.