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

Мне удалось записать ISO-образ на флэш-накопитель на другом компьютере. По-видимому, переключение разделов на одном компьютере - это не то же самое, что использование другого компьютера.

3
13.04.2017, 15:36
1 ответ

После нескольких дней исследований у меня есть 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, чтобы создать новое подменю для многопользовательских опций и создать внутри новую опцию для каждого ядра для многопользовательского режима. Здесь я добавлю патч с измененными строками:

--- /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.

1
27.01.2020, 21:37

Теги

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