Исправление загрузки в initramfs при запуске ubuntu

Building an initramfs image

Default images

Once you have installed dracut, you can use it to build an initramfs image. The simplest way to do this is to just run

The initramfs image created this way is a generic image, which will include all installed modules and system tools that it can find, suitable for booting a variety of machines. If you are producing an initramfs for just a single machine, you can specify that dracut should go into host-only mode:

The produced image will contain only those elements used by the local machine for booting. Certain modules behave differently in host-only mode. The kernel-modules module, for example, will only include the tools and modules used by the current rootfs file system, and the i18n module will install the fonts and keymaps for the local machine. Otherwise, every available file system, font, etc. would be included. You can set hostonly mode as the default in /etc/dracut.conf.

By default, dracut will produce an image suitable for booting the currently active kernel; it will pull the kernel modules needed for that kernel, etc. The image will be written in a file called /boot/initramfs-<kernel version>.img. You can override both options by specifying a new file name and kernel version on the command line, in that order. Both parameters are optional. To override the kernel version and keep the default file name, add the —kver option:

Modules

Dracut installs all available modules though some may need additional dependencies. The purpose of each module is to arrange for files to be included in the final initramfs image. In addition, dracut exposes hooks that run at certain points, which modules can hook into to perform required boot actions.

initramfs 개념

도입부

대부분의 사용자는 initramfs 시스템을 신경쓰지 않습니다. 사용자들은 단순한 파티션 구조와, (암호화된 파일 시스템같이)낯설지 않은 드라이버 또는 설정을 사용하기 때문에 리눅스 커널은 시스템에서 바이너리로 제어권을 넘길 수 있습니다. 다만 대부분의 시스템에서 initramfs는 거의 필수나 다름 없습니다.

initramfs가 무엇인지(무엇에 필요한지) 이해할 핵심 개념은 리눅스가 어떻게 부팅 과정을 처리하는지, 상위 레벨의 관점에서 이해하는 것입니다.

리눅스 부팅 과정

리눅스 커널이 (부트로더에서 불러오고 난 후의)시스템에 제어권을 넘기면, 메모리 구조와 드라이버를 가능한대로 준비하는 것입니다. 그 다음 시스템을 더 많이 준비하는 작업을 하는 (보통 ) 프로그램으로 제어권을 넘기며, 부팅 과정의 마지막에는 모든 필요한 서비스가 동작하는지 확인하며 사용자가 로그온 할 수 있게 처리합니다. 프로그램 실행으로 이러한 과정을 처리하는데, 다른 서비스 중에, 더 많은 요소를 불러올 데몬은 감지한 장치를 기반으로 시스템을 준비합니다. 를 실행하면, 아직 마운트 안된 모든 남아있는 파일 시스템을 마운트하며, 나머지 서비스를 시작합니다.

모든 필요한 파일과 도구가 같은 파일 시스템에 존재하는 시스템에서, 프로그램은 훨씬 더 많은 부팅 과정을 완벽하게 제어합니다만, 여러가지 파일 시스템을 정의했을 경우(또는 좀 더 낯선 방식의 설치요소를 올려두었다면), 좀 더 복잡해질 수 있습니다:

/usr 파티션이 다른 파일 시스템에 있을 경우, /usr에 있는 도구와 드라이버는 /usr를 사용할 수 있기 전에는 사용할 수 없습니다. 이들 도구가 /usr을 사용할 수 있게 하는 과정이 필요하다면, 시스템을 부팅할 수 없습니다.

이 문제를 해결하는 방법으로 오래전부터 initrd(초기 루트 장치)를 사용하는 방법이 있습니다.

초기 루트 디스크

initrd는 루트 파일 시스템의 프로그램으로 제어권을 넘기기 전에 필요한 파일 시스템을 마운트하는데 필수적인 도구와 스크립트를 포함하고 있는 메모리 기반 디스크 구조(램디스크)입니다. 리눅스 커널은 이 루트 디스크에서 시스템을 준비하는 설정 스크립트(보통 라고 하지만 필수적인 요소는 아닙니다)를 실행하고 실제 루트 파일 시스템으로 전환한 후 을 실행합니다.

비록 initrd 방식이 필요한 그 전부 자체겠지만, 몇가지 문제가 있긴 합니다:

완전히 구색을 갖춘 블록 장치이며 전체 파일 시스템에 대한 오버헤드를 필요로 하고, 고정 크기를 지니고 있습니다. 작은 inintrd를 사용하면 모든 필요한 스크립트를 넣을 수 없고 너무 크게 잡으면, 메모리를 쓸데 없이 많이 사용하게 됩니다.

실제 장치이기 때문에, 리눅스 커널의 캐시 메모리를 소모하며, 메모리 및 파일 관리 방식(페이징)을 사용하는 중에 메모리 소모 동작이 잘못될 수도 있습니다.

이 (아마도 말하기 힘든) 문제를 해결하기 위해 initramfs가 만들어졌습니다.

초기 램 파일 시스템

initramfstmpfs(유연한 크기의, 메모리 기반 경량 파일 시스템) 기반의 초기 램 파일 시스템이며 분할 블록 장치를 사용하지 않습니다(그래서 캐싱을 사용하지 않으며 먼저 언급한 모든 오버헤드를 없앴습니다). initrd처럼, 실제 루트 파일 시스템의 바이너리를 호출하기 전에 파일 시스템을 마운트하는데 필요한 도구와 스크립트를 넣습니다. 이러한 도구는 추상 레이어, 논리 볼륨 관리자, 소프트웨어 RAID, 파일 시스템 로더 기반 블루투스 드라이버 등에서(암호화된 파일 시스템을) 복호화할 수 있습니다.

initramfs의 내용은 cpio 아카이브를 만들면서 마련합니다. 는 오래된(검증된) 파일 아카이빙 솔루션입니다(그리고 결과 아카이브 파일을 cpio 파일 이라고 합니다). 이걸 분명하게 와 견주어볼 수 있습니다. 여기서 를 선택한 이유는 (코드 기반) 구현이 비교적 쉬웠고, (라 할 수 없던)장치 파일을 지원(및 유지)해주었습니다.

모든 파일, 도구, 라이브러리, 환경 설정(가능한 경우) 등을 cpio 아카이브에 놓습니다. 이 아카이브는 gzip 유틸리티를 활용하여 압축하며 리눅스 커널 부분에 저장합니다. 부트로더는 부팅 시간에 이 아카이브를 제공하여 커널이 initramfs가 필요함을 알도록 해줍니다.

initramfs를 커널이 감지하고 나면 tmpfs 파일 시스템을 만들고, 내용을 이 파일 시스템에 추출한 다음, tmpfs 파일 시스템의 루트에 위치한 init 스크립트를 실행합니다. 그 다음 이 스크립트로 실제 루트 파일 시스템을 마운트하고(다음 마운트를 확실하게 한 다음에는, 추가 모듈을 불러온다든지 하는 식으로, 암호화된 추상 레이어 같은 요소를 준비합니다) 이와 같이 다른 파일 시스템(/usr 또는 /var)을 활성화합니다.

루트 파일 시스템과 다른 실제 파일 시스템을 마운트 하고 나면 initramfs의 init 스크립트는 실제 루트 시스템으로 전환하고, 실제 루트 시스템의 /sbin/init을 호출하여 부팅 과정을 계속 진행합니다.

Ошибка диска: /dev/sda1 does not exist

Проблема с fstab

Если при загрузке сервера вы видите ошибку:

ALERT! /dev/sda1 does not exist. Dropping to a shell.

Скорее всего вы только что установили Linux или то на вашем сервере есть проблемы в fstab. Чаще всего проблема возникает при установке системы с usb-накопителя. Раздел на который ругается система, может быть какой угодно. Как и в первом случае, нам нужно загрузиться с образа системы и выполнить некоторые действия. Проверьте UUID диска командой:

Система выдаст что-то подобное:

/dev/sda2: UUID="36cce3d5-cbdb-46f4-adbf-3f9aaa01d729" TYPE="ext4" PARTUUID="fea4dab1-4e12-4327-85c6-76ade18f64e1"

Отсюда уже видно, что система должна загружаться с sda2, а по факту загружается с sda1.

Монтируем наш раздел в любую директорию, например:

Получаем в директории /mnt весь наш раздел /dev/sda2, находим там файл /etc/fstab и изменяем строку, содержащую /dev/sda1 на:

UUID=36cce3d5-cbdb-46f4-adbf-3f9aaa01d729 / ext4 errors=remount-rw 0 1

Сохраняем файл. Отмонтируем раздел от /mnt и перезагрузимся, если проблема была связана с не неправильным адресом разделе, сервер загрузится.

Так же данный вариант можно решить, загрузившись в emergency. Перемонтируйте корень для записи:

После чего измените fstab и перезапустите сервер.

Проблема с железом

На некоторых материнских платах порты SATA могут получать произвольные номера. Это также может вызвать описанную в предыдущем пункте ошибку. Для исправления ошибки нужно изменить загрузчик grub.

Загрузитесь в режиме emergency или с live-cd и измените файл /boot/grub/grub.cfg

В строке где происходит загрузка раздела, например:

Linux /boot/vmlinuz-4.15.0-70-generic root=/dev/sda1 rw quiet elevator=noop fsck.repair=yes

Измените путь до диска на UUID:

Linux /boot/vmlinuz-4.15.0-70-generic root=UUID=36cce3d5-cbdb-46f4-adbf-3f9aaa01d729 ro quiet elevator=noop fsck.repair=yes

initramfs のコンセプト

はじめに

多くのユーザーにとって、initramfs を使ったシステムは無関係です。そうした人々のシステムは単純なパーティションスキーマを採用しており、また(暗号化ファイルシステムのような)変わったドライバーや構成を使っていないため、Linux カーネルが init バイナリに制御を渡すことが確実にできるのです。しかしながら、多くのシステムにおいて、initramfs は必須です。

initramfs とは何か(そして何のために必要なのか)を理解する上で鍵となるコンセプトは、レベルの高いアプローチではありますが、Linux のブートプロセスが動作する仕組みを理解するということです。

Linux のブートプロセス

Linux カーネルが(ブートローダーによって読み込まれた後に)システムの制御を得ると、自身のメモリー構造とドライバーを準備します。それから、制御をあるアプリケーション(通常は init)に渡します。そのアプリケーションの役割は、さらにシステムの準備をすることと、ブートプロセスが終わった時点ですべての必要なサービスが実行されユーザーがログインできる状態にすることです。init アプリケーションはサービスの中でも、検出されたデバイスをもとにシステムのさらなる読み込みや準備を行う udev デーモンを起動することによってその作業を行います。udev が起動されるとまだマウントされていない残りのファイルシステムがすべてマウントされ、それから残りのサービスが開始されます。

必要なファイルやツールがすべて同じファイルシステムにあるシステムでは、init アプリケーションは以降のブートプロセスを完全に制御できます。しかし複数のファイルシステムが定義されている(またはもっと風変わりなインストールがなされている)場合には、事はもう少しトリッキーになります:

/usr パーティションが別のファイルシステムにある場合、/usr の中に保存されているツールやドライバーは /usr が利用可能になるまで使えません。そうしたツールが /usr を利用可能にするために必要な場合、システムをブートすることができなくなります。

ルートファイルシステムが暗号化されている場合、Linux カーネルは init アプリケーションを見つけることができないため、ブートできないシステムになってしまいます。

この問題への古くからある解決策が initrd (initial root device) を使うことです。

initial root disk

initrd は、ルートファイルシステムの init アプリケーションに制御を渡す前に必要なファイルシステムをマウントするのに必要なツールやスクリプトを含む、メモリー内ディスク構造 (ramdisk) です。Linux カーネルはこのルートディスクにあるセットアップスクリプト(通常は linuxrc と呼ばれますが、その名前である必要はありません)を起動します。セットアップスクリプトはシステムの準備や真のルートファイルシステムへの切り替えを行い、そして init を実行します。

initrd を使う方法は必要なことをすべて行えますが、いくつか欠点もあります:

これはれっきとしたブロックデバイスであり、ファイルシステム全体でオーバーヘッドが必要です; 固定サイズになります。initrd があまり小さすぎると必要なスクリプトがすべて収まりません。大きくしすぎるとメモリを浪費してしまいます。

これは真の、静的なデバイスなので Linux カーネル内のキャッシュメモリーを消費しますし、(ページングのような)メモリーやファイルを管理するメソッドを使用しがちになります。これにより、initrd はますます多くのメモリーを消費することになります。

こうした問題点を解決するために initramfs が作られました。

initial ram file system

initramfstmpfs (サイズを柔軟に設定できる軽量なメモリ内ファイルシステム)をもとにした初期 RAM ファイルシステムで、特別のブロックデバイスを使用しません(したがってキャッシュは起こらず、前に述べたオーバーヘッドはすべて無くなります)。initrd と同様に、initramfs には真のルートファイルシステム上にある init バイナリが呼び出される前にファイルシステムをマウントするために必要なツールやスクリプトが含まれています。これらのツールは(暗号化ファイルシステム用の)復号化抽象レイヤー、論理ボリュームマネージャー、ソフトウェア RAID、Bluetooth ドライバーベースのファイルシステムローダー等の場合があります。

initramfs の内容は cpio アーカイブを作ることで作成します。cpio は古い(しかし実績のある)ファイルアーカイバーです(そして、アーカイブファイルは cpio ファイルと呼ばれます)。cpio は tar アーカイバーと完全に同等です。ここで cpio が選ばれた理由は、コードの観点から実装がしやすく、また当時は tar がサポートしていなかったデバイスファイルをサポートしていたためです。

すべてのファイル、ツール、ライブラリ、(あれば)構成設定などは cpio アーカイブに収められます。このアーカイブはその後 gzip ユーティリティーを使って圧縮され、Linux カーネルとともに保管されます。ブートローダーは、カーネルが initramfs が必要であると知ることができるように、ブートする際に Linux カーネルに initramfs を提示します。

initramfs が検出されると、Linux カーネルは tmpfs ファイルシステムを作成してアーカイブの内容をそこに展開し、それから tmpfs ファイルシステムのルートにある init スクリプトを起動します。このスクリプトは(たとえば追加モジュールの読み込み、暗号化抽象レイヤーの準備などを行ってマウントができるようにしてから)真のルートファイルシステムとその他の重要なファイルシステム(たとえば /usr や /var など)をマウントします。

ルートファイルシステムやその他の重要なファイルシステムがマウントされると、initramfs の init スクリプトはルートを真のルートファイルシステムに切り替え、ブートプロセスを続けるためにシステムの /sbin/init バイナリを起動します。

Kernel configuration

In order to boot directly from UEFI, the kernel needs to know where to find the root () partition of the system to be booted. Enable EFI runtime service support (CONFIG_EFI), EFI stub support (CONFIG_EFI_STUB) and Built-in kernel command line (CONFIG_CMDLINE_BOOL) and add the root partition path (example: /dev/sda2) or its PARTUUID to (CONFIG_CMDLINE).

KERNEL Enable EFI stub support

Processor type and features  --->
     EFI runtime service support 
       EFI stub support
         EFI mixed-mode support
    ...
    ...
     Built-in kernel command line
    (root=/dev/sda2)

Using might be preferable. To find out use blkid:

NoteThe partition’s PARTUUID is distinct from the filesystem’s UUID.

/dev/sda2: UUID="d1e0c1e0-3a40-42c5-8931-cfa2c7deae32" TYPE="ext4" PARTUUID="adf55784-15d9-4ca3-bb3f-56de0b35d88d"

KERNEL CONFIG_CMDLINE — alternative using PARTUUID (example: adf55784-15d9-4ca3-bb3f-56de0b35d88d)

Processor type and features  --->
     Built-in kernel command line
    (root=PARTUUID=adf55784-15d9-4ca3-bb3f-56de0b35d88d)

Optional: Initramfs

If for some reason an initramfs is needed, it can either be embedded into the kernel or be used as a separate file.

In case it’s desired , it should also be copied or moved into the ESP and the NVRAM be updated accordingly.

Some UEFI implementations however seem to not support passing parameters from the NVRAM to the EFI stub kernel.

For embedding the initramfs directly into the kernel image, the Initramfs source file(s) (CONFIG_INITRAMFS_SOURCE) must be coded in the kernel (directly under the Initial RAM filesystem and RAM disk (initramfs/initrd) support (CONFIG_BLK_DEV_INITRD) option) as shown here for a custom initramfs created in :

KERNEL CONFIG_INITRAMFS_SOURCE=»/usr/src/initramfs» — (Example from Custom Initramfs)

General setup  --->
     Initial RAM filesystem and RAM disk (initramfs/initrd) support
    (/usr/src/initramfs) Initramfs source file(s)

Embedding takes place on compilation, so the kernel must then be recompiled and be moved (or copied) again into the ESP.

Отключить автоматическое монтирование

Systemd, может автоматически устанавливать как tmpfs, даже если у вас нет записи в вашем .

Для отключения автоматического монтирования, выполните следующую команду:

# systemctl mask tmp.mount

Файлы больше не будут хранится в tmpfs, но будут на вашем блочном устройстве.
Содержание теперь будет сохранятся между перезагрузками, чего вам бы не хотелось.
Чтобы сохранить прежнее поведение и очищать каталог атоматически когда вы перезагружаете машину, рассмотрите возможность использования :

/etc/tmpfiles.d/tmp.conf
# смотрите tmpfiles.d(5)
# очистка каталога /tmp всегда включена
D! /tmp 1777 root root 0

# удалить файлы в каталоге /var/tmp старше 10 дней
D /var/tmp 1777 root root 10d

# namespace mountpoints (PrivateTmp=yes) are excluded from removal
x /tmp/systemd-private-*
x /var/tmp/systemd-private-*
X /tmp/systemd-private-*/tmp
X /var/tmp/systemd-private-*/tmp

Installation

Kernel

Specific kernel options must be altered in order to get Plymouth working properly. Use the genkernel —menuconfig all command (or equivalent) in order to modify the kernel configuration.

It is highly advised to disable the Linux bootup logo. On some systems having the bootup logo displayed seems to cause problems.

KERNEL This example shows the correct way to disable the bootup logo:

Device Drivers --->
   Graphics Support --->
       Bootup logo  --->

ImportantBe sure to enable kernel modesetting (KMS) for the system’s respective graphics card.

KMS for Intel cards

KERNEL Intel onboard GPUs set to use modesetting:

Device Drivers --->
   Graphics Support --->
      <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  --->
         <*>   Intel 8xx/9xx/G3x/G4x/HD Graphics
              Enable modesetting on intel by default

ImportantIf this is the user’s first time modifying settings for on-board Intel GPUs the Intel article should be referenced for additional configuration.

KMS for Nvidia cards (Nouveau drivers)

KERNEL NVIDIAGPU set to use Nouveau:

Device Drivers  --->
    Graphics support  --->
        <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
            <*> Nouveau (nVidia) cards

ImportantIf this is the user’s first time changing settings for the NVIDIA graphics card using the nouveau driver be sure to reference the nouveau article for additional information.

KMS for Radeon cards

KERNEL Radeon GPU set to use modesetting:

Device Drivers --->
    Staging drivers  --->
           Enable modesetting on radeon by default

ImportantIf this is the user’s first time setting up a Radeon graphics card be sure to reference the radeon article for further information.

Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
Add support for x11-libs/gtk+ (The GIMP Toolkit)
Provides abstraction to the DRM drivers (intel, nouveau and vmwgfx at this moment)
Adds support for printing text on splash screen and text prompts, e.g. for password
Enable this if /bin and /usr/bin are separate directories
Build static versions of dynamic libraries as well
Enable virtual/udev integration (device discovery, power and storage device support, etc)

Создание initramfs

Введение и настройка загрузчика

Для создания initramfs, важно знать какие дополнительные драйверы, скрипты и утилиты необходимы для загрузки системы. Например, если используется LVM, то потребуется инструменты LVM в initramfs

Таким же образом, если используется программный RAID, будут нужна утилита mdadm, и так далее.

Существуют несколько инструментов, которые помогут создать initramfs (сжатые cpio-архивы) для системы. Тем, кому требуется полный контроль, также могут легко создать собственный, пользовательский образ initramfs.

После создания initramfs, необходимо настроить конфигурацию загрузчика для сообщения загрузчику, что будет использоваться initramfs. Например, если файл initramfs сохранен как /boot/initramfs-3.2.2-gentoo-r5, то конфигурация в /boot/grub/grub.conf будет выглядеть следующим образом:

Файл Пример записи в grub.conf для загрузки с initramfs

title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5

Использование genkernel

Утилита для сборки ядра Gentoo, genkernel, может использоваться для генерирования initramfs, даже если не использовался genkernel для конфигурации и сборки ядра.

Чтобы использовать genkernel для генерации initramfs, рекомендуется все необходимые драйверы и код, который требуется для монтирования и /usr файловых систем, включить в ядро (а не как модули). Затем, вызвать команду genkernel следующим образом:

В зависимости от системы, одна или более из следующих опций могут быть необходимы:

Опция Описание
Включить поддержку настроек в файл /etc/fstab
Включить поддержку fake hardware RAID
Включить firmware code, найденный на системе
Включить поддержку GnuPG
Включить поддержку iSCSI
Включить поддержку зашифрованных контейнеров luks
Включить поддержку LVM
Включить поддержку программного (software) RAID
Включить поддержку множественного I/O-доступа к SAN
Включить поддержку ZFS

По завершении, файл initramfs, полученный в результате, будет сохранен в каталоге /boot.

Использование dracut

Утилита dracut создана с единственной целью управления файлами initramfs. Она использует весьма модульный подход в плане выбора поддержки; что требуется включить, а что нет.

Рекомендуется установить (или убрать) необходимые модули. После настройки переменной DRACUT_MODULES в файле /etc/portage/make.conf запустите команду emerge dracut для установки утилиты Dracut.

Далее необходимо настроить dracut посредством редактирования /etc/dracut.conf. В файле конфигурации, который хорошо прокомментирован, включите поддержку необходимых модулей.

После конфигурации, создайте initramfs вызовом dracut следующим образом:

Образ, полученный в результате, поддерживает общую загрузку системы, основанную на конфигурации в /etc/dracut.conf. Также, можно выбрать генерирование initramfs специально приспособленной под вашу систему (в которой dracut пытается определить необходимые инструменты, драйверы, и так далее из существующей системы). Если модули и драйверы встроены в ядро (не отдельными модулями и ссылками на firmware), то можно добавить опцию :

Чтобы найти больше информации, проконсультируйтесь с man-страницами:

Usage

Regenerate the initramfs using the genkernel or dracut command, depending on which you’ve chosen earlier:

or

As long as the configuration has been performed properly, this will pack the selected Plymouth theme into the initramfs.

Then regenerate GRUB config to use the initramfs and apply your :

NoteFor Plymouth to work as intended the proper GRUB2 video modules must also be loaded. Generally the correct video modules are loaded by default on Gentoo, so inserting additional ones is not usually needed. If frame buffer or video problems are being experienced with GRUB2, be sure to investigate missing modules as a possible culprit.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector