Ubuntu 16.04.5 среда по умолчанию.
Я хочу сделать пользовательскую работу до инициализации. grub.cfg as
linux /boot/vmlinuz ... ro init=/root/init.sh
init.sh:
#!/bin/bash
# do some task
exec init 3
после загрузки, X запустился.
Если grub linux /boot/vmlinuz ... ro init=/root/init.sh 3
, может успешно загрузиться в текстовом режиме.
Согласно https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html , 3 не является параметрами командной строки ядра, ядро будет проходить это как аргумент для init, здесь /root/init.sh.
изменить /root/init.sh на:
#!/bin/bash
# do some task
echo $1
sleep 3s
exec init 3
Я вижу значение, переданное из ядра.
В моем представлении matter независимо от того, какое значение grub -> kernel -> /root/init.sh, я откажусь от значения и выполню init как уровень запуска 3. почему оно не работает.
в соответствии с ответом поэтаринга на мою проблему в systemd: https://github.com/systemd/systemd/issues/10752
мы обычно читаем / proc / cmdline , а не argv [], поскольку ядро удаляет из него некоторые биты, которые нам нужно знать. По сути, мы полностью игнорируем argv [].
Следовательно, то, что вы пытаетесь сделать, не работает, вам придется вместо этого монтировать / proc / cmdline с каким-то файлом с новыми аргументами.
blockquote>о «перемонтировании», согласно https://unix.stackexchange.com/questions/364442/cant-mount-on-proc-cmdline/364448 ,
[ 1113]сделать копию /proc/cmdline
в/root/cmdline
добавить 3
в конце/root/cmdline
запустить команду mount -n --bind -o ro /root/cmdline /proc/cmdline
команда run exec init
теперь система будет загружаться с уровнем запуска 3.
Таким образом, измените /root/init.sh на
#!/bin/bash # do some task cp /proc/cmdline /root/cmdline sed -i.bck '$s/$/ 3/' /root/cmdline mount -n --bind -o ro /root/cmdline /proc/cmdline exec init
система загрузится в текстовом режиме после завершения пользовательского задания, как я, за исключением.