На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
  
> Выбор дров на при загрузке Manjaro
    Салют!

    Установил Manjaro (KDE Plasma) на внешний SSD. Хочу сделать в GRUB-меню возможность выбора драйвера: open source или проприетарный NVIDIA (чтобы загружаться с нужным на разных машинах). Аналогично тому, как это делается в образе установщика.

    В бутлоадере установщика есть 2 пункта для выбора типа дров. Соответственно, конфиги такие:
    ExpandedWrap disabled
      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

    ExpandedWrap disabled
      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).
      Цитата Jin X @
      Просто установка обоих дров и прописывание этих параметров не работает.

      Вообще так и должно работать. Что в логах?

      Цитата Jin X @
      P.S. Вариант оставить open source и пользовался меня не устраивает (т.е. с ними всё работает медленнее, вентиляторы видюхи жужжат + мне нужна CUDA).

      Вообще у nvidia проприетарные драйвера старше 550 версии тоже open source.
        Jin X, вопрос конечно не простой, готового решения нет. Но есть возможность "спросить" ИИ ;)
        Посмотри ответ от ChatGPТ, может быть что-то поможет:

        Скрытый текст

        ExpandedWrap disabled
          # Настройка выбора драйверов (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.
          Хм. А в Calculate значит скрипты уже есть для похожего фокуса. Но там немного проще и по другому.

          Для дефолтных
          ExpandedWrap disabled
            cl-setup-video --video nouveau
            shutdown -r now


          Для проприетарных
          ExpandedWrap disabled
            cl-setup-video --video nvidia
            shutdown -r now


          Правда требует перезагрузки.
            Цитата macomics @
            Вообще так и должно работать. Что в логах?
            В каких логах, где смотреть?

            Цитата Majestio @
            Посмотри ответ от ChatGPТ
            ChatGPT и DeepSeek меня уже задрюкал своими идеями. Что я только не делал по их советам, результата нет.
            Но этот способ я ещё не пробовал. Попробую разобраться...
            initramfs пересобирал для разных конфигураций. Хук только не делал свой для этого.

            Цитата macomics @
            Хм. А в Calculate значит скрипты уже есть для похожего фокуса. Но там немного проще и по другому.
            Мне это нужно перед перезагрузке запускать? Так можно и через mhwd сновить/устанавливать.
            Мне нужно, чтобы в grub их можно было переключить.
              Majestio, это точно ChatGPT (без доп. настроек)? У меня он выдаёт более простые (и нерабочие) решения.
                Цитата Jin X @
                Majestio, это точно ChatGPT (без доп. настроек)? У меня он выдаёт более простые (и нерабочие) решения.

                Ну я пользовался ChatGPT-5 (https://chatgpt.com с регистрацией и через VPN), от там по 5-7 ответов дает бесплатно, потом сбрасывается до ChatGPT-4 и требует деньги. Вновь ChatGPT-5 включается часа через 4-ре.
                Хотя я часто еще пользую Grok, тоже своеобразная и не плохая штука (https://grok.com). Тут уже без регистрации, но тоже через VPN.
                А в качестве VPN пользую Хромовое дополнение - Browsec без премиума, так хватает.
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0310 ]   [ 14 queries used ]   [ Generated: 18.09.25, 02:16 GMT ]