The Darkest Library

[RU] WiFi при загрузке и без пароля на Ubuntu 20.04

Проблема

Шаги для воспроизведения:

  • Устанавливаем Убунту, десктопную версию
  • Сразу после установки в трее выбираем свойства сети и подключаемся к вайфаю
  • Устанавливаем галки Connect Automatically и Make available to other users
  • Перезагружаемся

Ожидается

  • Сразу после перезагрузки, ещё до запуска графической оболочки, уже доступна сеть по WiFi

На самом деле

  • После перезагрузки приходится дождаться запуска рабочего стола Gnome, и когда оно начинает соединяться с сетью – требует пароль на кейринг

Почему это жопа

  • Это не подходит для машины, которая предназначена для удалённого доступа к ней по SSH (в режиме командной строки) и VNC (в режиме рабочего стола Gnome).

Зачем

Расскажу на своём примере.

У меня есть машинка на Ubuntu 20.04 (старый MacMini 2013 года), который является одновременно сервером и десктопом. По большей части, он работает тестовым сервером и не требует графического интерфейса. Но иногда туда надо залогиниться и что-нибудь почнинить в графическом режиме, или отладить код в IDE, и тому подобное.

Ethernet отлично работает без танцев с бубном, но сервак стоит в таком месте, куда подключать его проводом было бы не только сложно, но и неэстетично. Чтобы включить WiFi вручную, щелкая мышкой по экрану, пришлось бы подключать физическую клавиатуру, мышку и монитор, что звучит как полное безумие.

Но выход есть.

Предварительные условия

  • На машину установлен десктопный (не серверный) вариант Ubuntu 20.04,
  • в стандартной полной поставке,
  • с рабочей средой Gnome

Костыли

Пробуем использовать пустой пароль для кейринга или пароль, совпадающий с паролем учетной записи. Если вы категорически против такого подхода – пропускаем весь раздел “костыли”. Если за, и это внезапно сработает – ура, вы победили, дальше по гайду идти не нужно!

  1. Идем в настройки соединения в гноме (Settings -> WiFi), ищем своё подключение, щелкаем по шестеренке там
  2. Ставим две галки: Connect Automatically и Make available to other users
  3. Соединяемся с этой точкой (любым удобным способом)
  4. Вызываем общее “меню Пуск”
  5. Вписываем в поиск “Passwords”, находится один элемент – админка “Passwords and Keys”
  6. Открываем её, ищем пункт Default Keyring. Правой кнопкой мыши по нему, выбираем change password.
  7. Когда попросят новый пароль:
    • Либо оставляем оба поля пустыми (пароль и подтверждение)
    • Либо вводим туда пароль, совпадающий с паролем от учетной записи текущего пользователя
    • В случае проблем, стоит попробовать оба варианта!
  8. Появится диалоговое окно, рассказывающее, что теперь все, кто хакнул вашу файловую систему, хакнут и кейринг тоже. Очевидно, что если кто-то добрался до вашей файлухи, вы в полной жопе и без всякого кейринга. Соглашаемся.
  9. Перезагрузка
  10. Проверяем, произошло ли автоматическое соединение. Пинганите ваш компьютер по IP с какого-нибудь внешнего устройства, или посмотрите, отображается ли он в админке роутера.
    • Если произошло – ура, вы всё починили. Можно закрывать эту статью.
    • Если не произошло – отключаемся от вайфая, забываем сеть (жмем шестеренку в настройках вайфая, выбираешь Forget Connection). И идем дальше по гайду.
  11. Возвращать назад прежний пароль от кейринга не нужно!

Выключаем Network Manager

  1. Установите пакеты:
    sudo apt install ifupdown net-tools
  2. Выключите NetworkManager:
    sudo systemctl stop NetworkManager
    sudo systemctl disable NetworkManager-wait-online NetworkManager-dispatcher NetworkManager
  3. Теперь нам нужно как-то не остаться без локальной сети 🙂
  4. Найдите имя своего сетевого интерфейса через ifconfig -a. У меня это enp1s0f0.
  5. Отредактируйте (или создайте, если его нет) файл /etc/network/interfaces
    Вот таким текстом:
    auto lo
    iface lo inet loopback

    allow-hotplug enp1s0f0
    iface eth0 inet dhcp
  6. Если у вас не DHCP, а статичный айпишник, то содержимое файла будет немного другим, например:
     auto lo
    iface lo inet loopback

    iface enp1s0f0 inet static
    address 192.168.1.37
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8
  7. Попробуйте поднять интерфейс:
    ifup enp1s0f0
  8. Проверьте, что IP действительно подхватился: ifconfig или ip addr, что больше нравится.
  9. Если всё хорошо и IP подхватился – идём дальше. Иначе – плачем, медитируем и включаем назад Network Manager.
  10. Отключаем интерфейс:
    ifup enp1s0f0
  11. Создаем systemd юнит для запуска ifup при загрузке:
    sudo vim /etc/systemd/system/lan.service
  12. Используем текст файла:
     [Unit]
    Description=LAN Service

    [Service]
    Type=forking
    ExecStart=/usr/sbin/ifup enp1s0f0
    ExecStop=/usr/sbin/ifdown --ignore-errors --force enp1s0f0
    Restart=always
    RestartSec=5

    [Install]
    WantedBy=default.target
  13. Перезагружаем демоны:
    sudo systemctl daemon-reload
  14. Тестируем наш новый демон:
    sudo systemctl start lan
    ping ya.ru
    Если Яндекс пингуется, значит всё хорошо! Иначе – плачем и медитируем, пока не починим.
  15. Устанавливаем наш новый сервис в автозагрузку:
    sudo systemctl enable lan
  16. Перезагружаемся и проверяем, что всё работает.
  17. Теперь, когда мы уверены, что не останемся без интернета и не окирпичим девайс, можно приступать к настройке WiFi.

Настраиваем WPA Supplicant

  1. Узнаём, как называется wifi-интерфейс: iwconfig. У меня он называется “wlp2s0”, что бы это ни значило, спасибо Лёне за предсказуемые имена!
    Вообще, это не очень репрезентативная картинка, т.к. на ней сеть уже подключена. Но если я отключу вайфай, чтобы сделать вам скриншот, то не смогу дописать этот текст 🙂
  2. В дальнейшем тексте подразумевается, что
    wlp2s0 – название интерфейса
    Overwatch-5G – название сети
    changeme – пароль этой сети
  3. Если сеть не подключена, ее надо пнуть вот так:
    sudo ifconfig wlp2s0 up
  4. Скорей всего, вы и так знаете название своей WiFi сети. Но если вдруг не знаете, то вам поможет такое:
    sudo iwlist wlp2s0 scan | grep ESSID
  5. Устанавливаем софтину, которая будет подключаться к вайфаю:
    sudo apt install wpasupplicant
  6. Создаем файл конфигурации:
    wpa_passphrase Overwatch-5G changeme | sudo tee /etc/wpa_supplicant.conf
  7. Теперь нужно протестировать, что конфиг получился правильный.
    Давайте подключимся к этой сети:
    sudo wpa_supplicant -c /etc/wpa_supplicant.conf -i wlp2s0
    Если всё завелось, в выхлопе будет что-то вроде:
    wlp2s0: CTRL-EVENT-CONNECTED - Connection to 5C:6A:80:58:33:62 completed [id=0 id_str=]
    Если такой строчки нет – чинить пока не починится. Пока проблема не решится – можно дальше по гайду не идти.
  8. Чтобы остановить тестирование – надо нажать Ctrl+C.
  9. Если прям совсем хорошо хочется потестировать, то можно запустить всё в фоне:
    sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlp2s0
    Получить IP-адрес вручную:
    sudo dhclient wlp2s0
    Проверить, что он реально получился:
    ip addr show wlp2s0
    И потом отпустить его назад:
    sudo dhclient wlp2s0 -r
    Но это всё совершенно необязательно, и делать стоит только в случае проблем.
  10. Если у вас скрытая сеть, то строит добавить строчку scan_ssid=1 в /etc/wpa_supplicant.conf, прямо между фигурных скобочек.
  11. Теперь займемся автозапуском. Скопируем шаблон systemd юнита в рабочую директорию:
    sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
  12. Отредактируем его немного:
    sudo vim /etc/systemd/system/wpa_supplicant.service
  13. Найдем строчку вот такого вида:
    ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
    и заменим на что-то вроде:
    ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlp2s0
  14. Сразу за этой строкой добавляем совершенно новую строку:
    Restart=always
  15. Если вы где-то увидите вот такую строку:
    Alias=dbus-fi.w1.wpa_supplicant1.service
    То нужно будет её отключить, добавив перед ней символ решётки:
    # Alias=dbus-fi.w1.wpa_supplicant1.service
  16. Сохраняем файл!
  17. Обновляем демоны:
    sudo systemctl daemon-reload
  18. Добавляем в автозагрузку:
    sudo systemctl enable wpa_supplicant.service
  19. Теперь надо не забыть получить IP-адрес, точно так же, как мы делали в тесте руками. Редактируем демона:
    sudo vim /etc/systemd/system/dhclient.service
  20. Новый текст:
    [Unit]
    Description= DHCP Client
    Before=network.target
    After=wpa_supplicant.service
    PartOf=wpa_supplicant.service

    [Service]
    Type=forking
    ExecStart=/sbin/dhclient wlp2s0 -v
    ExecStop=/sbin/dhclient wlp2s0 -r
    Restart=always
    RestartSec=5

    [Install]
    WantedBy=default.target
  21. Сохраняем файл!
  22. Добавляем в автозагрузку:
    sudo systemctl enable dhclient.service
  23. PROFIT

Замечания

Если вам надоели “удобные” и “предсказуемые” имена сетевых интерфейсов, то можно от них избавиться.

  1. Отредактируйте конфиг загрузчика:
    sudo vim /etc/default/grub
  2. Поменяйте строку
    GRUB_CMDLINE_LINUX="что-то-что-там-уже-есть"
    на
    GRUB_CMDLINE_LINUX="что-то-что-там-уже-есть net.ifnames=0 biosdevname=0"
  3. Примените изменения:
    sudo update-grub
  4. Перезагрузка:
    sudo reboot

Если вы часто перезагружаетесь и вас достали получасовые проверки диска при каждой загрузке, имеет смысл там же, не отходя от кассы, дописать в конец GRUB_CMDLINE_LINUX ещё и параметр fsck.mode=skip

Если вам интересны подробности про Raspberry Pi или про получение статического адреса по WiFi (практически никогда не нужно, но тем не менее), можно обратиться вот к этой статье.

Вместо заключения

Очень печально, что в 2021 году в Линуксе элементарные действия нужно заклинать с помощью чёрной магии и негуманоидных текстов. Будем надеяться, что в будущем это исправят. Надежда умирает последней.

olegchir

Links: Facebook | Twitter | Instagram

Indie game developer. All opinions are my own.

Add comment

Follow me (@olegchir)

Don't be shy, get in touch. I love meeting interesting people and making new friends.

Most popular

Most discussed