Có thể đặt root trong LVM mà không cần sử dụng initrd không?


12

Tôi vừa thiết lập một hệ thống cơ sở Gentoo (có nghĩa là tôi có thể khởi động và đăng nhập và làm mọi thứ với nó ngay bây giờ). Phân vùng gốc của tôi nằm trong một nhóm ảo LVM2 (có /bootphân vùng riêng ). Để khởi động, tôi cần truyền các tham số bên dưới cho kernel:

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

Rõ ràng là nó đang sử dụng một ramdisk ban đầu để làm một cái gì đó (tôi đoán đang tải những thứ LVM) trước khi gắn root. Có cách nào để tôi có thể đặt mã này vào kernel để không cần initrd không? Nếu không, làm thế nào tôi có thể tự làm initrd?

Có thể hữu ích khi thêm rằng tôi đã thử biên dịch kernel cho root không phải LVM, không có initrd và nó hoạt động hoàn hảo. Sau đó, tôi đã cố gắng đặt toàn bộ mọi thứ theo LVM và không thể khởi động máy (tôi đoán nó không thể xử lý các công cụ LVM). Sau đó, tôi đã sử dụng genkernelcông cụ với --lvmtùy chọn và nó tạo ra kernel đang hoạt động và initrd mà tôi hiện đang sử dụng.

Bây giờ tôi muốn bỏ qua genkernelvà tự làm mọi thứ, tốt nhất là không có initrd để máy khởi động nhanh hơn một chút (dù sao tôi cũng không cần sự linh hoạt).


Một initrd có thể có ảnh hưởng nhỏ đến thời gian khởi động, nhưng nó sẽ không ảnh hưởng đến hiệu suất của hệ thống của bạn một khi nó hoạt động.
Kristof Provost

ồ vâng, tôi thực sự có nghĩa là thời gian khởi động, đã được chỉnh sửa
phunehehe

Câu trả lời:


6

Câu trả lời đơn giản: Không. Nếu bạn muốn LVM, bạn cần có một initrd.

Nhưng như những người khác đã nói trước đây: LVM không làm chậm hệ thống của bạn hoặc làm bất cứ điều gì xấu theo cách khác, họ chỉ cho phép bạn tạo một môi trường cho phép kernel của bạn tải và thực hiện công việc của nó.

Initrd cho phép kernel của bạn được tải: Nếu kernel của bạn nằm trên ổ LVM, toàn bộ môi trường LVM phải được thiết lập trước khi nhị phân có chứa kernel có thể được tải.

Kiểm tra Wikipedia Entry trên initrd để giải thích những gì initrd làm và lý do tại sao bạn cần nó.

Một lưu ý khác: Tôi thấy quan điểm của bạn là muốn tự mình làm mọi thứ nhưng bạn có thể bị bẩn tay ngay cả với genkernel. Sử dụng genkernel --menuconfig tất cả và về cơ bản bạn có thể thiết lập mọi thứ như thể bạn sẽ xây dựng kernel hoàn toàn mà không cần hỗ trợ công cụ, genkernel chỉ cần thêm bzImage, tạo mô-đun và tạo các mô-đun mô-đun cho bạn và thực hiện công cụ khởi tạo khó chịu đó.

Rõ ràng bạn có thể tự xây dựng initrd vì nó được phác thảo ở đây cho initramfs hoặc ở đây cho initrd .


Vâng cảm ơn vì đã xác nhận, nhưng bạn bỏ lỡ phần "Nếu không, làm thế nào tôi có thể tự thực hiện initrd?"
phunehehe

Đã thêm một số thông tin và hợp nhất câu trả lời khác của tôi vào câu hỏi này.
tante

8
Một sửa chữa nhỏ: initrd không được sử dụng để tải kernel : kernel được tải bởi bootloader (GRUB, LILO, sao cũng được); initrd là một loại đĩa ram cung cấp hệ thống tập tin gốc ban đầu. Nó nên chứa tất cả các tệp nhị phân (ví dụ: các mô-đun hạt nhân, các chương trình hỗ trợ không gian người dùng) cần thiết để thực sự làm cho hệ thống hoạt động. Đây là lý do tại sao cần thiết cho một gốc LVM: hệ thống con LVM cần được khởi tạo và việc khởi tạo của nó quá phức tạp để có thể thực hiện thuận tiện chỉ với các tham số khởi động kernel; do đó, linuxrctập lệnh trong initrd thực hiện nhiệm vụ này.
Riccardo Murri

Bạn là tất nhiên đúng, tôi đã hơi cẩu thả với phrasing của tôi.
tante

2
Không thể upvote vì lỗi khá lớn trong câu trả lời (initrd không cho phép kernel được tải).
wzzrd

5

chỉnh sửa: chỉ nhận ra bạn đang cố gắng khởi động trên LVM, tôi chưa bao giờ thiết lập LVM, không bao giờ cần đến chúng, vì vậy có lẽ cách tiếp cận ở đây có thể không hiệu quả

Dưới đây là các quy tắc cơ bản bạn cần thực hiện để tạo kernel không có initrd (từ bộ nhớ, tôi không nhớ chính xác):

  1. Biên dịch lại kernel của bạn, đảm bảo tích hợp vào kernel (QUAN TRỌNG: không phải là mô-đun!):

    1. trình điều khiển bo mạch chủ và trình điều khiển ổ cứng (cả dưới Device Drivers)
    2. điều khiển hệ thống tập tin cho /, /etc/*/lib/modules/*(dưới File systems)

    Về cơ bản, kernel cần có khả năng gắn hệ thống tập tin gốc, đọc / etc / fstab, tải các mô-đun trình điều khiển khác (nếu cần) và gắn các hệ thống tập tin không phải root khác để hoàn thành phần còn lại của quá trình khởi động. Nếu bạn có quá trình khởi động liên quan nhiều hơn, ví dụ khởi động mạng thì bạn cũng cần tích hợp sẵn các trình điều khiển đó.

  2. Vô hiệu hóa initrd khỏi kernel "Thiết lập chung> Hệ thống tập tin RAM ban đầu và đĩa RAM (initramfs / initrd) hỗ trợ" hay còn gọi là CONFIG_BLK_DEV_INITRD = n.

  3. Sửa đổi cấu hình GRUB, bạn không còn cần init = và realroot =, và thiết lập root = để nó trỏ đến thiết bị hệ thống tập tin gốc.

Tôi nghĩ rằng đó là tất cả. Đừng quên giữ một kernel dự phòng và một bản sao tốt của CD Live có thể khởi động, trong trường hợp có điều gì đó xảy ra.

Những điều có thể sai: nếu bạn biên dịch sai trình điều khiển hoặc nếu bạn biên dịch các trình điều khiển cơ bản dưới dạng mô-đun, thì kernel không thể đọc được hệ thống tập tin. Khởi động lại với kernel mới hoặc với CD Live và biên dịch lại kernel với trình điều khiển chính xác.

Phần khó duy nhất là tìm ra trình điều khiển nào có liên quan đến phần cứng của bạn. Bạn có thể sử dụng lspcilshwđể giúp xác định phần cứng của bạn. Nếu bạn chưa có những công cụ này emerge lshw pciutils.


+1 để đề cập đến mô đun tích hợp so với mô đun trong biên dịch kernel.
amphetamachine

lsmodtừ một kernel đang chạy cũng hữu ích.
LawrenceC

2

Vâng, bạn cần một initrd. Đây là lý do tại sao:

Quá trình khởi động bình thường bắt đầu với bộ nạp khởi động, biết đủ về hệ thống của bạn để tìm kernel và chạy nó. (GRUB2 đủ thông minh để tìm hạt nhân nằm trên phân vùng LVM2 hoặc RAID, nhưng GRUB1 thì không, vì vậy, chúng tôi thường khuyên bạn nên tạo / khởi động như một phân vùng riêng với bố cục đơn giản.) Khi đã tải, kernel cần để có thể tìm thấy hệ thống tập tin gốc, vì vậy nó có thể bắt đầu quá trình khởi động. Tuy nhiên, LVM không thể bắt đầu mà không được kích hoạt bởi một số công cụ không gian người dùng, tồn tại trên hệ thống tệp gốc, không thể được tải mà không có các công cụ LVM, tồn tại trên hệ thống tệp gốc ...;)

Để phá vỡ chu trình này, initrd hoặc initramfs là một hệ thống tệp nén được lưu trữ với kernel (trong / boot hoặc bên trong kernel), chứa một hệ thống Linux vừa đủ để khởi động các dịch vụ như LVM hoặc MD hoặc bất cứ thứ gì khác bạn muốn. Đó là một hệ thống tệp tạm thời và chỉ hoạt động như hệ thống tệp gốc của bạn đủ lâu để gốc thực sự được tải.

Theo như thực sự tạo ra một, hầu hết các tài liệu về chủ đề này đã lỗi thời một cách đáng kinh ngạc - ví dụ, lvm2create_initrd, thậm chí không còn hoạt động trên Gentoo nữa. . xử lý (và tìm hiểu các thông tin chi tiết về cách Linux khởi động trong quy trình), nhưng rất nhiều công việc.

Câu trả lời ngắn gọn: sử dụng Dracut. Đó là một khung công tác mới được tạo ra để tạo ra một initramfs theo cách chủ yếu là tự động, và đó là trong phần dịch chuyển. Tài liệu này hơi thưa thớt, nhưng có đủ để tìm ra mọi thứ, và đó là cách dễ nhất để có được một initramfs vững chắc và một gốc LVM.


2

Mặc dù không thể không sử dụng một số loại initrd nhưng không thể sử dụng các tệp initrd riêng biệt. (Tôi chưa bao giờ sử dụng genkernel nên tôi không thể đưa ra hướng dẫn cho nó).

Ví dụ tôi đã đặt tùy chọn:

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

Trường hợp /usr/src/initrd.contentscủa tôi trông như thế nào (tôi có LVM + tuxonice + fbsplash):

dir /bin                                    0755 0 0
file    /bin/busybox                        /bin/busybox                        0755 0 0
file    /bin/lvm                        /sbin/lvm.static                    0755 0 0
dir /dev                                    0755 0 0
dir /dev/fb                                 0755 0 0
dir /dev/misc                               0755 0 0
dir /dev/vc                                 0755 0 0
nod /dev/console                                0600 0 0    c  5   1
nod /dev/null                               0600 0 0    c  1   3
nod /dev/snapshot                               0600 0 0    c 10 231
nod /dev/tty1                               0600 0 0    c  4   0
dir /etc                                    0755 0 0
dir /etc/splash                             0755 0 0
dir /etc/splash/natural_gentoo                      0755 0 0
dir /etc/splash/natural_gentoo/images                   0755 0 0
file    /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  0644 0 0
file    /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0
file    /etc/splash/natural_gentoo/1680x1050.cfg        /etc/splash/natural_gentoo/1680x1050.cfg        0644 0 0
slink   /etc/splash/tuxonice                    /etc/splash/natural_gentoo              0755 0 0
file    /etc/splash/luxisri.ttf                 /etc/splash/luxisri.ttf                 0644 0 0
dir /lib64                                  0755 0 0
dir /lib64/splash                               0755 0 0
dir /lib64/splash/proc                          0755 0 0
dir /lib64/splash/sys                           0755 0 0
dir /proc                                   0755 0 0
dir /mnt                                    0755 0 0
dir /root                                   0770 0 0
dir /sbin                                   0755 0 0
file    /sbin/fbcondecor_helper                 /sbin/fbcondecor_helper                 0755 0 0
slink   /sbin/splash_helper                 /sbin/fbcondecor_helper                 0755 0 0
file    /sbin/tuxoniceui_fbsplash               /sbin/tuxoniceui_fbsplash               0755 0 0
file    /sbin/tuxoniceui_text                   /sbin/tuxoniceui_text                   0755 0 0
dir /sys                                    0755 0 0
file    /init                           /usr/src/init

/usr/src/initlà:

#!/bin/busybox ash
local X ROOT RUNLEVEL INIT PARAM
# Preliminary stuff
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/lvm vgchange -ay picard-main

# Try to resume. This never returns if it succeeds
test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume
#/bin/resume

# Parse the command line for relevant options.
INIT=/sbin/init
RESCUE=""
PARAM=" "
for X in `cat /proc/cmdline`
do
        case "$X" in
                root=*) ROOT=${X#root=} ;;
                [0-6Ss]) RUNLEVEL=${X} ;;
                init=*) INIT=${X#init=} ;;
                rescue) RESCUE="rescue" ;;
        splash=*) PARAM="${PARAM} ${X}" ;;
        consol=*) PARAM="${PARAM} ${X}" ;;
        esac
done

if [ x${RESCUE} = xrescue ]
then
        busybox ash
fi

# Mount and switch root.
mount -o ro ${ROOT} /mnt
umount -f /sys || umount -l /sys
umount -f /proc || umount -l /proc

exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM}

1

Vâng, đúng vậy.

Các biến chứng phát sinh từ việc tạo và xử lý initrd được hiển thị nếu bạn cài đặt và sử dụng grub2. Wiki grub2 http://grub.enbug.org/LVMandRAID mô tả cách bạn có thể có / boot trên lvm mà không có gì khác ngoài lvm insmod trong grub.cfg, tệp cấu hình grub, do đó không cần phải có initrd.

grub2 hiện tại phiên bản 1.98 nhưng vẫn ở nhánh thử nghiệm trong gentoo. Tuy nhiên, nó có thể được cài đặt trong một khe khác và hoàn toàn có thể sử dụng được.

Thưởng thức!


này thực sự trông rất tuyệt, tôi phải thử!
phunehehe
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.