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