Создайте пользовательскую запись debian grub для запуска systemd multiuser.target

У меня есть Debian Stretch, и я хотел бы иметь пользовательскую запись grub для запуска системы без графического рабочего стола. Я думал, что это будет так же просто, как запустить другой уровень выполнения, но, читая об этом, я знал, что в системе все по-другому.

После прочтения этого вопроса о Red Hat, а также этой другой для Debian Jessie, я узнал о systemd целях, и я думаю, что то, что я хочу сделать, работает в multi-user.target.

Я нашел эту ссылку fedora , эту ссылку ядра archlinux и другую . Все они объясняют, что есть один вариант «systemd.unit», который можно добавить в строку «linux» в записи меню grub. Итак, я искал ссылки, чтобы объяснить, как создать пользовательский элемент меню: этот . Но, глядя мои собственные автоматические записи grub с ключом «e» на экране grub, они более сложны, чем та, что в ссылке. Проблема в том, что я не знаю, должен ли я скопировать все это в пользовательский пункт меню.

  setparams 'Debian gnu/linux, con linux 4.8.0-2-amd64' load_video insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part-msdos insmod ext2 set root='hd0,msdos5' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 3202c741-ef05-40e4-9368-8617e7b1fb3c else search --no-floppy --fs-uuid --set=root 3202c741-ef05-40e4-9368-8617e7b1fb3c fi echo 'Cargando Linux 4.8...' linux /vmlinuz-4.8.0-2-amd64 root=UUID=17f74892-fe09-46ec-91ca-2dca457565a1 ro quiet echo 'Cargando imagen de memoria inicial...' initrd /initrd.img-4.8.0-2-amd64 

Это моя автоматически созданная запись для моего последнего ядра. Могу ли я просто скопировать все это в пользовательскую запись в меню и изменить только

 linux /vmlinuz-4.8.0-2-amd64 root=UUID=17f74892-fe09-46ec-91ca-2dca457565a1 ro quiet 

чтобы быть

 linux /vmlinuz-4.8.0-2-amd64 root=UUID=17f74892-fe09-46ec-91ca-2dca457565a1 ro quiet systemd.unit=multi-user.target 

?

One Solution collect form web for “Создайте пользовательскую запись debian grub для запуска systemd multiuser.target”

После нескольких дней исследований у меня есть 3 подхода к проблеме создания пользовательских записей для запуска Systemd Debian без графического рабочего стола от Grub . Я считаю, что лучший подход – это 1.

1. Создание нового файла конфигурации /etc/grub.d/*

Для этого я скопировал файл /etc/grub.d/10_linux в качестве шаблона:

 sudo cp /etc/grub.d/10_linux /etc/grub.d/11_multiuser 

Исходный файл создает корневую запись для последнего ядра, а также подменю «Дополнительные параметры». Таким образом, я немного 11_multiuser свой файл 11_multiuser , просто создав новое подменю для многопользовательских опций и создав внутри нового варианта для каждого ядра для многопользовательского режима. Здесь я добавлю патч с измененными строками:

 --- /etc/grub.d/10_linux +++ /etc/grub.d/11_multiuser @@ -118,6 +118,8 @@ case $type in recovery) title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;; + multiuser) + title="$(gettext_printf "%s, with Linux %s (multiuser)" "${os}" "${version}")" ;; init-*) title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "${type#init-}")" ;; *) @@ -227,57 +229,18 @@ boot_device_id= title_correction_code= -cat << 'EOF' -function gfxmode { - set gfxpayload="${1}" -EOF -if [ "$vt_handoff" = 1 ]; then - cat << 'EOF' - if [ "${1}" = "keep" ]; then - set vt_handoff=vt.handoff=7 - else - set vt_handoff= - fi -EOF -fi -cat << EOF -} -EOF - -# Use ELILO's generic "efifb" when it's known to be available. -# FIXME: We need an interface to select vesafb in case efifb can't be used. -if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then - echo "set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX" -else - cat << EOF -if [ "\${recordfail}" != 1 ]; then - if [ -e \${prefix}/gfxblacklist.txt ]; then - if hwmatch \${prefix}/gfxblacklist.txt 3; then - if [ \${match} = 0 ]; then - set linux_gfx_mode=keep - else - set linux_gfx_mode=text - fi - else - set linux_gfx_mode=text - fi - else - set linux_gfx_mode=keep - fi -else - set linux_gfx_mode=text -fi -EOF -fi -cat << EOF -export linux_gfx_mode -EOF - # Extra indentation to add to menu entries in a submenu. We're not in a submenu # yet, so it's empty. In a submenu it will be equal to '\t' (one tab). submenu_indentation="" -is_top_level=true +# para el menu de multiuser +submenu_indentation="$grub_tab" +if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" +fi +gettext_printf "Agregando entradas multiuser...\n" >&2 +echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote) (MultiUser)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {" +is_top_level=false while [ "x$list" != "x" ] ; do linux=`version_find_latest $list` case $linux in @@ -331,34 +294,9 @@ linux_root_device_thisversion=${GRUB_DEVICE} fi - if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then - linux_entry "${OS}" "${version}" simple \ - "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" - - submenu_indentation="$grub_tab" - - if [ -z "$boot_device_id" ]; then - boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" - fi - # TRANSLATORS: %s is replaced with an OS name - echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {" - is_top_level=false - fi - - linux_entry "${OS}" "${version}" advanced \ - "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" - - for supported_init in ${SUPPORTED_INITS}; do - init_path="${supported_init#*:}" - if [ -x "${init_path}" ] && [ "$(readlink -f /sbin/init)" != "${init_path}" ]; then - linux_entry "${OS}" "${version}" "init-${supported_init%%:*}" \ - "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} init=${init_path}" - fi - done - if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then - linux_entry "${OS}" "${version}" recovery \ - "${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}" - fi + linux_entry "${OS}" "${version}" multiuser \ + "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} systemd.unit=multi-user.target" + list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '` done 

С помощью этого решения, если я добавляю / удаляю ядра или выполняю некоторые действия, которые связаны с любой реконфигурацией меню grub, мои нужные многопользовательские записи будут автоматически добавляться для каждого ядра. Кроме того, я думаю (но не совсем уверен), что если я обновляю grub, мой новый файл конфигурации 11_multiuser не будет удален, учитывая, что он не является частью предопределенных файлов конфигурации Grub.

2. Изменение файла /etc/grub.d/10_linux

Это другой подход, но я думаю, что это хуже первого. Таким образом, вы модифицируете официальный файл, чтобы вы могли разбить конфигурацию Grub и весь запуск системы. Кроме того, если какое-либо обновление приводит к замене файла, вы можете потерять свою конфигурацию. Для этого есть только одно преимущество: вы можете вставлять многопользовательские записи в подменю «Дополнительные параметры». Патч, добавленный для первого подхода, частично действителен для этого. Во всяком случае, я совершенно не согласен с этим.

3. Изменение файла /etc/grub.d/40_custom

Этот файл предназначен для вставки определенных записей. Вы можете скопировать запись из /boot/grub/grub.cfg и вставить ее в этот файл, добавив systemd. Это нормально, но проблема в том, что вы должны сделать это для каждого нужного ядра. Кроме того, при удалении / добавлении новых ядер в систему вы должны поддерживать этот файл вручную. Кроме того, эти записи появляются в конце меню grub, и если у вас есть другие операционные системы, такие как Windows, ваши пользовательские записи будут отделены от первых записей Linux.

Interesting Posts

Скомпилированные (?) Java-пакеты на Debian

Как копировать только файлы в указанный каталог в другую папку

Семантика дедупликации с btrfs – метаданные различаются, данные файлов идентичны

Невозможно использовать -o allow_other с sshfs (опция включена в файле fuse.conf)

получить имя интерфейса хоста, используемое интерфейсом VirtualBox в «мостовом режиме»,

Как передавать видео с веб-камеры в сеть с помощью ffmpeg?

Переносить файлы между компьютерами Windows и Linux?

Выберите последний файл, основанный на порядковом номере, указанном в имени файла

Можно ли ссылаться на последний измененный файл в аргументе командной строки?

Не удается избавиться от старого сетевого подключения Bluetooth в NetworkManager

backupninja: пароль вне файла конфигурации

Отключить эмулированное колесо прокрутки (EmulateWheel) для определенных программ

Может ли программа «du» быть менее агрессивной?

как изменить все имена хостов, отправленные по имени хоста –all-fqdns?

Неверная строка версии «GNU / Linux» при создании загрузочного USB-накопителя

Linux и Unix - лучшая ОС в мире.