Làm cách nào để tạo một bản phân phối Linux tùy chỉnh chỉ chạy một chương trình và không có gì khác?


12

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 .


Chào mừng bạn đến với U & L, vui lòng tham gia một chuyến tham quan có hướng dẫn và dành thời gian để tìm hiểu cách đặt câu hỏi bạn muốn làm gì? bởi vì định nghĩa của ứng dụng khá mơ hồ và không có nghĩa gì cả, bởi vì lời khuyên của tôi sẽ là sử dụng busyboxnhư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 đó.
Kiwy

1
Có vẻ khá rõ ràng đối với tôi ...
goldilocks

@ TAFKA'goldilocks 'không, bởi vì tôi cá là bạn vẫn có thể có quyền truy cập vào một thiết bị đầu cuối hoặc một cái gì đó tương tự trên XBMCubfox trong khi dường như chỉ có một ứng dụng đang chạy đồ họa, nhưng không có một ứng dụng nào đang chạy. Tôi đã tạo một bản phân phối nhỏ một lần từ đầu chỉ với kernel và busybox, trong trường hợp đó, ngay cả khi có các dịch vụ được khởi chạy bởi kernel, bạn có thể nói busybox là ứng dụng duy nhất của bạn.
Kiwy

@Kiwi Đó là một câu trả lời tốt sau đó (tốt hơn LFS). Hãy ghi nhớ: 1) Câu hỏi này có thể hữu ích cho những người khác có mục đích chung là như nhau, vì vậy một loạt các câu trả lời là tốt, 2) Trong khi có một loạt các giải pháp khả thi ở đây - tức là TIMTOWTDI - và một số thể phù hợp hơn với một số mục tiêu cụ thể hơn các mục tiêu khác, tôi khá chắc chắn rằng tất cả chúng sẽ hoạt động và một khía cạnh quan trọng của việc quyết định giải pháp sẽ mang tính chủ quan (ví dụ, vì kiến ​​thức và kinh nghiệm trước đây của OP, chứ không phải bản chất khách quan của nhiệm vụ) .
goldilocks

Câu trả lời:


6

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 jessiephá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 ~/.xinitrcgiố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.


1
Bạn không thể làm mà không initnhưng chắc chắn bạn có thể làm mà không upstart, systemd,hay sysv. initchỉ là một số tập tin thực thi đặt tên initmà 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 initnhưng họ đang thực sự execed vào bởi init,đó thườngbusybox.
mikeserv

@mikeerv Hoàn toàn (và tôi đã đề cập rõ ràng rằng đây không phải là ba lựa chọn duy nhất). Cũng lưu ý rằng tôi cố tình loại trừ busyboxvì đ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.
goldilocks

Làm thế nào duyên dáng của bạn để cung cấp! Nhưng không có cách nào chết tiệt.
mikeerv

Sẽ rất thú vị nếu biết cách tiếp cận này thực sự có hiệu quả trong thực tế. Bất cứ ai thực sự đã thử nó?
Faheem Mitha

@FaheemMitha Nếu bạn muốn nói điều tôi muốn giới thiệu ở đây (tùy chỉnh cấu hình init), tất nhiên là vậy - đó là cách hệ thống đã hoạt động, bạn sẽ tạo ra một phiên bản rút gọn và đơn giản hóa (tôi chắc chắn đây là XBMCbutu là gì). Nếu bạn muốn nói, thay thế init bằng một số busybox ala chuyên dụng hơn, có lẽ sẽ rắc rối hơn giá trị của nó trừ khi bạn phải làm theo cách đó - mục đích chính của busybox là để sử dụng trong các môi trường nhúng nhỏ (ví dụ, chỉ một vài MB RAM).
goldilocks

18

Tối thiểu init chương trình thế giới từng bước

nhập mô tả hình ảnh ở đây

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ừ /initchương trình khi kernel chạy.

Sau đó cdvà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/sdXvà:

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


4
Đây có lẽ là câu trả lời bị đánh giá thấp nhất ở đây: D. Tuyệt vời!
msouth 16/2/2017

1
@msouth ít hơn một chút vì vậy bây giờ :-)
Ciro Santilli 病毒 审查 六四 事件 法轮功

1

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


1

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ư:


1

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 ..

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.