
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
![]() |
![]() |
|
Салют!
Установил Manjaro (KDE Plasma) на внешний SSD. Хочу сделать в GRUB-меню возможность выбора драйвера: open source или проприетарный NVIDIA (чтобы загружаться с нужным на разных машинах). Аналогично тому, как это делается в образе установщика. В бутлоадере установщика есть 2 пункта для выбора типа дров. Соответственно, конфиги такие: ![]() ![]() setparams 'Boot with open source drivers' 'x86_64 lang=en_US keytable=us tz=UTC misobasedir=manjaro misolabel=MANJARO_KDE_2587 quiet systemd.show_status=1 splash' # set arguments above with the editor linux /boot/vmlinuz-$2 driver=free nouveau.modeset=1 i915.modeset=1 radeon.modeset=1 initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-x86_64.img ![]() ![]() setparams 'Boot with proprietary drivers' 'x86_64 lang=en_US keytable=us tz=UTC misobasedir=manjaro misolabel=MANJARO_KDE_2587 quiet systemd.show_status=1 splash' # set arguments above with the editor linux /boot/vmlinuz-$2 driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1 initrd /boot/amd_ucode.img /boot/intel_ucode.img /boot/initramfs-x86_64.img Не считая заголовка отличия только в строке linux: driver=free nouveau.modeset=1 и driver=nonfree nouveau.modeset=0 Получается, можно как-то установить 2 типа дров на одно ядро и переключаться между ними через параметры GRUB. Как это сделать? Просто установка обоих дров и прописывание этих параметров не работает. Подскажете, как это устроено в загрузочном образе и как такое провернуть после установки ОС на SSD? P.S. Вариант оставить open source и пользовался меня не устраивает (т.е. с ними всё работает медленнее, вентиляторы видюхи жужжат + мне нужна CUDA). |
Сообщ.
#2
,
|
|
|
Цитата Jin X @ Просто установка обоих дров и прописывание этих параметров не работает. Вообще так и должно работать. Что в логах? Цитата Jin X @ P.S. Вариант оставить open source и пользовался меня не устраивает (т.е. с ними всё работает медленнее, вентиляторы видюхи жужжат + мне нужна CUDA). Вообще у nvidia проприетарные драйвера старше 550 версии тоже open source. |
Сообщ.
#3
,
|
|
|
Jin X, вопрос конечно не простой, готового решения нет. Но есть возможность "спросить" ИИ
![]() Посмотри ответ от ChatGPТ, может быть что-то поможет: Скрытый текст ![]() ![]() # Настройка выбора драйверов (open source/prop NVIDIA) в GRUB для Manjaro на внешнем SSD Салют! Ты хочешь воспроизвести механизм выбора драйверов из live-образа Manjaro в установленной системе на внешнем SSD, чтобы в GRUB было два пункта: один с open source (Nouveau + другие free-драйверы), другой с proprietary NVIDIA (для CUDA и лучшей производительности). Это логично для внешнего диска, который подключаешь к разным машинам — на одной NVIDIA, на другой Intel/AMD, и не хочется каждый раз переустанавливать драйверы. ## Как это устроено в live-образе Manjaro В установочном ISO (live-среде) Manjaro использует специальный механизм, встроенный в initramfs (начальный RAM-диск, генерируемый mkinitcpio). Ключевые моменты: - **Параметр `driver=free/nonfree`** в kernel command line (который ты видишь в GRUB-меню ISO) читается на раннем этапе загрузки (в initramfs или сразу после, в ранних скриптах live-окружения). - Live-образ содержит **оба набора драйверов** в сжатом filesystem (squashfs): open source (Nouveau, i915, radeon и т.д.) и proprietary (nvidia.ko модуль, userspace-библиотеки, Xorg-драйвер). - Если `driver=free`: - Включают `nouveau.modeset=1` для KMS (kernel mode setting, для плавного boot и Plymouth splash). - Автоматически загружают open source модули (nouveau для NVIDIA, i915 для Intel и т.д.). - Не трогают proprietary. - Если `driver=nonfree`: - `nouveau.modeset=0` (отключает Nouveau, чтобы избежать конфликта). - Скрипты в initramfs (через custom hooks mkinitcpio или udev-rules в live) blacklist'ают nouveau (добавляют в /etc/modprobe.d временный blacklist), modprobe'ают nvidia-модуль рано (для KMS с `nvidia-drm.modeset=1`). - Затем Xorg/sddm (в live) использует proprietary драйвер из squashfs. - Это работает, потому что live — это не полноценная установленная система: всё в RAM, драйверы "на лету", без постоянного xorg.conf или mhwd-конфигурации. Установщик (Calamares) потом видит параметр и устанавливает соответствующий профиль mhwd (video-linux для free, video-nvidia для nonfree). - Источник: Это кастомизация Manjaro на базе Arch (mkinitcpio hooks в их ISO-профиле на GitLab manjaro/manjaro-tools). Нет статического конфликта, потому что выбор на runtime (во время загрузки). В установленной системе это не работает "из коробки", потому что: - mhwd (Manjaro Hardware Detection) позволяет установить только **один профиль** для PCI-устройства (video-linux или video-nvidia). При установке proprietary он автоматически uninstall'ает open source, blacklist'ает nouveau статически (/etc/modprobe.d/nvidia.conf) и генерирует xorg.conf для nvidia. - Просто добавить параметры в GRUB и установить оба — не сработает: модули конфликтуют (nvidia и nouveau не могут работать одновременно, Nouveau загружается авто, nvidia требует blacklist). Initramfs статический (строится mkinitcpio -P), без conditional логики по умолчанию. - На разных машинах: Если proprietary установлен, на машине без NVIDIA оно fallback'нет на VESA/software render (медленно), но boot пройдёт. Но для выбора на NVIDIA-машине нужно conditional. ## Как это реализовать после установки на SSD Есть два подхода: простой (рекомендую для твоего случая с внешним SSD и разными машинами) и продвинутый (репликация live-механизма с custom hook). Простой — без хаков, но требует места на SSD. Продвинутый — ближе к live, но сложнее и рискованнее (может сломать boot, если ошибёшься). ### 1. Простой подход: Две параллельные установки Manjaro (с shared /home) Это аналог "dual boot" для драйверов. Устанавливаешь две копии Manjaro на SSD, одну с free-драйверами, вторую с nonfree. GRUB увидит оба, и ты выбираешь в меню. /home общий — настройки, файлы сохраняются. Идеально для внешнего SSD: на non-NVIDIA машине выбираешь free, на NVIDIA — nonfree (с CUDA). **Шаги:** - **Подготовка SSD:** Если SSD не разбит, используй live-ISO для partitioning. Создай: - /dev/sdX1: EFI (512MB, fat32, для GRUB). - /dev/sdX2: 20-30GB для первой установки (/ free). - /dev/sdX3: 20-30GB для второй (/ nonfree). - /dev/sdX4: Остальное для /home (ext4 или BTRFS для snapshots). - **Установка первой (free-драйверы):** - Boot в live-ISO, выбери "Boot with open source drivers" (driver=free). - Запусти Calamares, укажи / на /dev/sdX2, /home на /dev/sdX4, EFI на /dev/sdX1. - После установки перезагрузись, проверь — должно работать с Nouveau/i915/radeon. - **Установка второй (nonfree):** - Boot в live-ISO снова, но выбери "Boot with proprietary drivers" (driver=nonfree). - В Calamares: / на /dev/sdX3, /home на /dev/sdX4 (он смонтируется, но файлы не затрёт, если осторожно — или удали /home/manjaro сначала, если нужно чистый старт). - Calamares увидит параметр и установит proprietary NVIDIA (mhwd -a pci nonfree автоматически). - После — reboot, GRUB покажет два пункта (Manjaro free и Manjaro nonfree). Выбирай нужный. - **Настройка GRUB (опционально):** - Boot в nonfree-установку, `sudo nano /etc/default/grub`. - Добавь в GRUB_CMDLINE_LINUX_DEFAULT: "quiet splash" (убери лишнее). - `sudo update-grub` — обновит меню для обеих. - Для free-установки аналогично (boot в неё и update-grub). - **Плюсы:** Нет конфликтов, CUDA работает в nonfree, open source — в free. На non-NVIDIA машине free загрузится нормально, nonfree может fallback'нуть, но выбирай free. - **Минусы:** Двойное место (~40-60GB), два набора пакетов (но /home shared — данные одни). Если обновления, делай в обеих (manjaro-chroot -a из live для фикса). - **Если сломается:** Boot в live, chroot в проблемную (/etc/manjaro-chroot -a), `mhwd -a pci free/nonfree` для фикса. Это работает, как в форуме Manjaro (похожие кейсы для hybrid GPU или multi-machine). ### 2. Продвинутый подход: Custom hook в mkinitcpio для conditional загрузки (как в live) Реплицируем live: Устанавливаем proprietary, но делаем blacklist/modeset conditional на параметре `driver`. Это требует ручной установки пакетов (mhwd сломает), custom скрипта в initramfs. Риск: Может black screen на boot, если скрипт глючит — имей live-ISO для recovery. **Предварительно:** - Boot в систему (с proprietary, если уже установлено: `sudo mhwd -a pci nonfree`). - Установи пакеты для обоих (вручную, без mhwd, чтобы избежать uninstall): - Proprietary: `sudo pacman -S nvidia nvidia-utils lib32-nvidia-utils nvidia-settings cuda` (для CUDA). - Open: Уже в kernel (nouveau), но убедись: `sudo pacman -S xf86-video-nouveau` (если нужно). - Удали статический blacklist: `sudo rm /etc/modprobe.d/nvidia.conf` (или отредактируй, удали blacklist nouveau). - Удали xorg.conf для nvidia (чтобы X auto-detect): `sudo rm /etc/X11/xorg.conf` и `sudo rm -r /etc/X11/xorg.conf.d/*` (или сделай conditional позже). - В /etc/mkinitcpio.conf добавь в `MODULES=(nvidia)` — чтобы nvidia был в initramfs. - Для KMS в proprietary добавь в GRUB_CMDLINE_LINUX_DEFAULT: "nvidia-drm.modeset=1" (но мы сделаем conditional). **Создай custom hook для conditional:** - Создай директорию: `sudo mkdir -p /usr/lib/initcpio/hooks /usr/lib/initcpio/install` - Скрипт хука (/usr/lib/initcpio/hooks/graphics_choice.sh): ```bash #!/bin/bash run_earlyhook() { DRIVER=$(getarg "driver") if [ "$DRIVER" = "nonfree" ]; then # Proprietary NVIDIA echo "blacklist nouveau" > /etc/modprobe.d/tmp-blacklist-nouveau.conf modprobe -r nouveau 2>/dev/null || true # Если nouveau загружен, выгрузи modprobe nvidia # Для KMS echo "options nvidia-drm modeset=1" > /etc/modprobe.d/nvidia-kms.conf else # Open source rm -f /etc/modprobe.d/tmp-blacklist-nouveau.conf /etc/modprobe.d/nvidia-kms.conf modprobe -r nvidia 2>/dev/null || true modprobe nouveau # Для KMS echo "options nouveau modeset=1" > /etc/modprobe.d/nouveau-kms.conf fi } ``` - `sudo chmod +x /usr/lib/initcpio/hooks/graphics_choice.sh` - Install-скрипт (/usr/lib/initcpio/install/graphics_choice): ```bash #!/bin/bash add_module "nvidia" add_module "nouveau" copy_exec /usr/lib/initcpio/hooks/graphics_choice.sh /scripts/graphics_choice ``` - `sudo chmod +x /usr/lib/initcpio/install/graphics_choice` - В /etc/mkinitcpio.conf добавь в `HOOKS=(base graphics_choice udev autodetect modconf block plymouth ... )` — рано, перед udev. - `sudo mkinitcpio -P` - Обнови GRUB: В /etc/default/grub, `GRUB_CMDLINE_LINUX_DEFAULT="quiet systemd.show_status=1 splash"` (без modeset, хук добавит). - Для двух entry: Используй grub-customizer (`sudo pacman -S grub-customizer`), создай два: один с + "driver=free nouveau.modeset=1", второй с + "driver=nonfree nouveau.modeset=0". - Или вручную в /etc/grub.d/40_custom: ```bash menuentry 'Manjaro Free' { linux /boot/vmlinuz-linux driver=free nouveau.modeset=1 i915.modeset=1 radeon.modeset=1 quiet splash initrd /boot/initramfs-linux.img } menuentry 'Manjaro Nonfree' { linux /boot/vmlinuz-linux driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1 quiet splash initrd /boot/initramfs-linux.img } ``` - `sudo update-grub` **Дополнительно для Xorg/KDE:** - После boot хук загрузит модуль, но для X (sddm) может нужен xorg.conf. Создай systemd-service (/etc/systemd/system/graphics-setup.service): ```bash [Unit] Description=Setup graphics based on driver param Before=sddm.service [Service] Type=oneshot ExecStart=/bin/bash -c 'DRIVER=$(cat /proc/cmdline | grep -o "driver=[^ ]*" | cut -d= -f2); if [ "$DRIVER" = "nonfree" ]; then mhwd -a pci nonfree --no-confirm; else mhwd -a pci free --no-confirm; fi' [Install] WantedBy=multi-user.target ``` - `sudo systemctl enable graphics-setup` - Но mhwd может конфликтить, так что лучше вручную: В ExecStart генерируй xorg.conf.d/10-nvidia.conf или 10-nouveau.conf на основе param. Пример для nonfree: `echo 'Section "Device" Identifier "NVIDIA" Driver "nvidia" EndSection' > /etc/X11/xorg.conf.d/10-nvidia.conf` **Тестирование/риски:** - Boot в live, chroot в систему для теста. - Если black screen: Добавь "nomodeset" в GRUB временно, boot в TTY (Ctrl+Alt+F3), fix mkinitcpio. - Для CUDA: В nonfree оно будет работать, если пакеты установлены. И да, выше ответ в формате markdown - его можно смотреть и в текстовом редакторе, но лучше в просмотрщике типа CuteMarkEd. |
Сообщ.
#4
,
|
|
|
Хм. А в Calculate значит скрипты уже есть для похожего фокуса. Но там немного проще и по другому.
Для дефолтных ![]() ![]() cl-setup-video --video nouveau shutdown -r now Для проприетарных ![]() ![]() cl-setup-video --video nvidia shutdown -r now Правда требует перезагрузки. |
![]() |
Сообщ.
#5
,
|
|
Цитата macomics @ В каких логах, где смотреть?Вообще так и должно работать. Что в логах? Цитата Majestio @ ChatGPT и DeepSeek меня уже задрюкал своими идеями. Что я только не делал по их советам, результата нет.Посмотри ответ от ChatGPТ Но этот способ я ещё не пробовал. Попробую разобраться... initramfs пересобирал для разных конфигураций. Хук только не делал свой для этого. Цитата macomics @ Мне это нужно перед перезагрузке запускать? Так можно и через mhwd сновить/устанавливать.Хм. А в Calculate значит скрипты уже есть для похожего фокуса. Но там немного проще и по другому. Мне нужно, чтобы в grub их можно было переключить. |
![]() |
Сообщ.
#6
,
|
|
Majestio, это точно ChatGPT (без доп. настроек)? У меня он выдаёт более простые (и нерабочие) решения.
|
Сообщ.
#7
,
|
|
|
Цитата Jin X @ Majestio, это точно ChatGPT (без доп. настроек)? У меня он выдаёт более простые (и нерабочие) решения. Ну я пользовался ChatGPT-5 (https://chatgpt.com с регистрацией и через VPN), от там по 5-7 ответов дает бесплатно, потом сбрасывается до ChatGPT-4 и требует деньги. Вновь ChatGPT-5 включается часа через 4-ре. Хотя я часто еще пользую Grok, тоже своеобразная и не плохая штука (https://grok.com). Тут уже без регистрации, но тоже через VPN. А в качестве VPN пользую Хромовое дополнение - Browsec без премиума, так хватает. |