Недетерминизм Systemd вначале в начальной загрузке от squashfs

Короткая версия

При начальной загрузке точно той же системы неоднократно, иногда сообщения загрузки запускаются с

[  ...] systemd[1]: Set hostname to <liab>.
[  ...] systemd[1]: Mounted /.
[  ...] systemd[1]: Mounted /host.
[  ...] systemd[1]: Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.

в то время как в других случаях они запускают с

[  ...] systemd[1]: Set hostname to <liab>.
[  ...] systemd[1]: Unit host.mount is bound to inactive unit dev-sda1.device. Stopping, too.
[  ...] systemd[1]: Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.

и испытайте недостаток в нескольких сервисных сообщениях запуска позже, по сравнению с бывшим случаем. Как я могу найти причину для этого?

Долгая версия

У меня есть очень нестандартная установка здесь, так как я создаю установку киоска.

Создание корневой файловой системы

Я не сделал runn полный установщик Ubuntu, но начинаюсь с debootstrap --variant=minbase … vivid, добавление некоторых пакетов и настройка материала в chroot. Это chroot затем используется для создания squashfs, который служит корневой файловой системой моей установки.

Монтирование от initramfs

Тот squashfs только для чтения содержится в файле в некоторой файловой системе хоста, которая могла бы быть vfat или ext4 или что бы то ни было. Это смонтировано initramfs. Для достижения этого, у меня есть файл в /etc/initramfs-tools/conf.d/ который устанавливает LOOP к пути squashfs в корневой файловой системе, и также устанавливает LOOPFSTYPE=squashfs. squashfs содержит пустой названный каталог /host который вызывает /usr/share/initramfs-tools/scripts/local кому: mount -o move файловая система хоста к тому каталогу. Поэтому, когда initramfs передает управление systemd, я буду иметь / и /host смонтированный и готовый к употреблению.

fstab

Мой /etc/fstab чтения

# <fs>          <mountpoint>    <type>          <opts>                                          <dump/pass>
/dev/loop0      /               squashfs        nodev,noauto,ro                                 0 0
/host/boot      /boot           auto            bind,ro                                         0 0
none            /run            tmpfs           noexec,nodev,nosuid                             0 0
none            /tmp            tmpfs           noexec,nodev,nosuid                             0 0
none            /var/tmp        tmpfs           noexec,nodev,nosuid                             0 0
none            /var/log        tmpfs           noexec,nodev,nosuid,size=5%                     0 0
none            /home/liab      tmpfs           nodev,nosuid,uid=liab,gid=liab,mode=0770        0 0

Таким образом, у меня есть запись для / но это отмечено noauto так как initramfs уже заботился об этом, правильно? Тем не менее, опции, перечисленные там, по-видимому, применяются в какой-то момент, который я заметил, в то время как я accidentially имел nosuid там. У меня нет записи для /host так как я не знаю устройство, я должен был бы использовать для этого. initramfs может решить, что устройство из конфигурации загрузчика, но я не хотел бы включать любой идентификатор файловой системы или некоторых такой это в squashfs, начиная с того же squashfs, должно быть применимым от различных файловых систем хоста.

Начальная загрузка

В настоящее время я только загружаю эту установку в qemu. И я использую -snapshot опция, с файловой системой моя учетная запись пользователя не может изменить. Таким образом, я уверен, что нет никакого изменения вообще в базовом изображении файловой системы, и любым различием в поведении должно поэтому быть последствие некоторого недетерминизма, скорее всего, некоторое состояние состязания. Мой qemu вызов в настоящее время читает несколько как это:

qemu-system-x86_64 \
-serial stdio \
-kernel …/boot/vmlinuz-3.19.0-15-generic \
-append 'console=ttyS0 root=/dev/sda1' \
-initrd …/initrd.img-3.19.0-15-generic \
-snapshot -hda …/hdimg

Таким образом, я получу экран, который в конечном счете покажет GUI, но я также распечатаю сообщения загрузки к терминалу, где я запустил qemu, который гостевое ядро будет рассматривать как последовательную консоль. Именно те сообщения к консоли имеют меня взволнованный.

По-видимому, initramfs делает это - задание очень хорошо и затем передает управление systemd. Systemd в свою очередь будет отображать приветствие, устанавливать имя хоста и затем по-видимому, следовать за одним из двух возможных путей.

Первые причины пути монтируют сообщения для / и /host. Запуск с сообщения [ OK ] Reached target Swap., многие шаги начальной загрузки будут обозначены строкой сообщения, запускающейся в [ OK ] с OK, распечатанным в зеленом. Позже, вероятно, в ответ на Starting Journal Service, dmesg- как сообщения с меткой времени исчезают, по-видимому, перенаправленные некоторому регистрирующемуся демону и только им [ OK ] сообщения остаются.

Второй путь не упоминает, что повторно монтировался / и /host вначале. Вместо этого это пишет Unit host.mount is bound to inactive unit dev-sda1.device. Stopping, too.. dev-sda1.device там соответствует root=/dev/sda1 аргумент ядра; изменение этого к некоторому идентификатору файловой системы изменяет сообщение об ошибке соответственно. В этом процессе начальной загрузки никогда нет никакие цветные линии. Соответствующие строки просто, кажется, отсутствуют в целом, даже если журнал строк с меткой времени запускается и завершение многих из тех же шагов. Порядок этих шагов отличается. Что означает, что, после того как сервис журнала начал, я не вижу сообщений вообще больше.

До сих пор я не могу сказать то, что другие фактические различия эти различные начальные загрузки вызывают для рабочей системы. Но мне не нравится недетерминированное поведение, которое я не понимаю.

Отладка

В попытке отладить эту ситуацию, добавил я systemd.log_target=console systemd.log_level=debug к командной строке ядра. Один нежелательный эффект этого состоял в том, что initramfs выполнение распечатает миллион строк, по-видимому, во время udev обработки событий. Соответствующая часть журнала, кажется, следующая. Если я получаю зеленый OK любит, это читает

Using notification socket /run/systemd/notify
Successfully created private D-Bus server.
dev-loop0.device changed dead -> tentative
dev-sda1.device changed dead -> tentative
Trying to enqueue job host.mount/start/fail
Installed new job host.mount/start as 1
Installed new job -.slice/start as 4
Installed new job system.slice/start as 3
Installed new job dev-sda1.device/start as 5
Installed new job -.mount/start as 2
Enqueued job host.mount/start as 1
host.mount changed dead -> mounted
Job host.mount/start finished, result=done
-.mount changed dead -> mounted
Job -.mount/start finished, result=done
Activating default unit: default.target
Failed to load configuration for all.target: No such file or directory
Failed to load configuration for bluetooth.service: No such file or directory
Failed to load configuration for hal.service: No such file or directory
Failed to load configuration for kbd.service: No such file or directory
Failed to load configuration for console-screen.service: No such file or directory
Failed to load configuration for plymouth-quit-wait.service: No such file or directory
Failed to load configuration for plymouth-quit.service: No such file or directory
Failed to load configuration for display-manager.service: No such file or directory
Trying to enqueue job graphical.target/start/isolate
Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
Job dev-sda1.device/start finished, result=canceled
Installed new job syslog.socket/start as 90

и если я не получаю те строки, это вместо этого читает

Using notification socket /run/systemd/notify
Successfully created private D-Bus server.
host.mount changed dead -> mounted
Unit host.mount is bound to inactive unit dev-sda1.device. Stopping, too.
Trying to enqueue job host.mount/stop/fail
Installed new job host.mount/stop as 1
Enqueued job host.mount/stop as 1
-.mount changed dead -> mounted
dev-loop0.device changed dead -> tentative
dev-sda1.device changed dead -> tentative
Activating default unit: default.target
Failed to load configuration for bluetooth.service: No such file or directory
Failed to load configuration for hal.service: No such file or directory
Failed to load configuration for kbd.service: No such file or directory
Failed to load configuration for console-screen.service: No such file or directory
Failed to load configuration for all.target: No such file or directory
Failed to load configuration for plymouth-quit-wait.service: No such file or directory
Failed to load configuration for plymouth-quit.service: No such file or directory
Failed to load configuration for display-manager.service: No such file or directory
Trying to enqueue job graphical.target/start/isolate
Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
Job host.mount/stop finished, result=canceled
Startup finished in 13.247s (kernel) + 2.322s (userspace) = 15.569s.
Installed new job systemd-modules-load.service/start as 48

Не уверенный, имеет ли это какое-либо применение.

1
задан 4 May 2015 в 14:03

0 ответов

Другие вопросы по тегам:

Похожие вопросы: