Как пропатчить планшет под OpenSuSE
Всем привет, меня зовут Иван. Хочу поделиться опытом, который может пригодиться тем, кто захочет сделать такую же странную вещь, как и я, — установить OpenSuse на планшет с Windows.
Наступила осень, на улице холодно и мокро, велосипед поставлен на зимовку. Хочется сидеть на диване и серфить в Интернете под расслабляющую музыку. А где проблема? А она в том, что планшет был пожертвован детям, а жена свой не даст. Значит, пришло время прикупить новый.
Муки выбора и «хитрый» план
Решение принято, но что брать? Наступает тот самый момент, когда гик должен выбрать новый девайс. Скажу честно: продукцией Apple не интересуюсь и даже не рассматривал в качестве варианта. Казалось бы, можно взять Android и радоваться, но не тут-то было. Хочется чего-то…
И тут в выдаче всплывает недорогой Irbis TW104 с Windows. Хм, да он еще и на Intel Atom. Получается это мини-ноутбук в формфакторе планшета. Беру! Поставлю на него свой любимый OpenSuSE, буду на диванчике в родном окружении чилить.
Итого: процессор Intel Atom x5-Z8350 (4 ядра), 1.44 ГГц, 4 Гбайта ОЗУ, разъем под microSD (смогу оставить Windows и сделать dual boot), встроенная в чехол клавиатура с мышью и вроде бы разъем USB, но, похоже, через кабель OTG. Докидываю в корзину OTG-кабель и какую-то microSD на 128 Гбайт из тех, что пошустрее.
Анбоксинг и первый запуск
Сутки мучительного ожидания позади — и вот новая игрушка у меня в руках. Первые впечатления: увесист, пухловат (современные Android-планшеты, конечно, тоньше и легче), но на ощупь приятен, а с прицепленной клавиатурой превращается в ноутбучек. Мне нравится, желания вернуть не возникло.
Включаю, появляется логотип фирмы-производителя, затем Windows радостно приветствует меня и не менее радостно предлагает разрешить передавать всякое в Microsoft. Дохожу до создания учетной записи, и тут он требует почту, чтобы сделать учетную запись Microsoft. Гуглю: надо было пропустить подключение к Wi-Fi, тогда Windows дает завести локальную учетную запись.
Зажимаю кнопку питания, перезапускаю устройство, и, о чудо, — девайс предлагает завести локальную учетную запись. Вроде все работает, нести устройство в гарантию не надо, попробуем поставить Linux.
Попытка установки 1: неудача
Итак, приступаю к установке. Первым делом качаю OpenSuSE 15.5 Leap. Как оказалось, зря, дальше расскажу почему. Если захотите повторить мой путь, качайте сразу Offline Image.
Небольшое пояснение, у OpenSuSE есть два типа дистрибутивов:
Leap — версия OpenSuSE из пакетов SUSE Linux Enterprise, стабильный дистрибутив;
Tumbleweed — версия из пакетов, собранных на основе последних наработок сообщества, так называемый rolling release.
Я, естественно, выбираю тот, что постабильней.
Заливаю с Unetbootin дистрибутив на флешку. Собираю конструкцию из нее и OTG-кабеля, захожу в UEFI, чтобы поменять порядок загрузки, и сталкиваюсь с первым приколом — экран повернут набок. Немного поразмышляв о сооружении системы зеркал, чтобы «выпрямить» картинку, решаю, что пока потерплю.
В меню загрузки менять ничего не пришлось: USB-устройства и так идут первыми. Запускаю инсталлятор, снова получаю повернутый экран и еще одну проблему: сетевых устройств не найдено, и по сети систему не поставить. Деваться некуда, качаю офлайн-инсталлер.
Попытка 2: опять мимо
Имидж скачан и залит на флешку, запускаю установку — и снова получаю повернутую картинку, а еще инвертированную мышь и неработающий тачпад.
Перемещаться по кнопкам можно с помощью Tab, выбирать кнопки и поля ввода — пробелом. Для подтверждения выбора — Enter.
Инсталлятор предлагает удалить раздел Windows и поставить систему на него, такой вариант не подходит. Отказываюсь от предложения системы и создаю разметку с / на microSD. После перезагрузки во время установки снова грузится Windows. В UEFI загрузчик OpenSuSE виден, но при попытке оверрайда запуска из UEFI все равно грузится Windows.
Может, из-за Secure Boot? Отключаю (кстати, тут мне повезло: отключенный Secure Boot, возможно, сэкономил мне кучу времени позже), но все равно грузится не то. Пробую рассуждать логически: вероятно, все дело в том, что у меня /boot на microSD, и надо попробовать перенести этот раздел «внутрь».
Попытка 3: удача (но с оговорками)
Заново запускаю инсталлятор, дохожу до раздела с разметкой и понимаю, почему инсталлятор предлагал удалить раздел с Windows полностью — раздел зашифрован Bitlocker, так просто ресайз ему не сделать. Ctrl-Alt-Del.
Загрузка в Windows, лезу в раздел «Настройки», нахожу там в подразделе «Обновление и безопасность» пункт Bitlocker и жму «Расшифровать». Полчаса на чаек и посмотреть в окно в ожидании. После расшифровки — снова загрузка инсталлятора OpenSuSE, разметка /boot-раздел на встроенной Flash, и / на microSD.
В целом догадка оказалась верной. После установки встречает повернутый набок GRUB.
Победа? Нет. Не монтируется /. Меня встречает печальная консоль Single User. Так, если инсталлятор видел microSD, а установленная система — нет, проблема понятна: ядро Linux при запуске монтирует специальный CPIO-архив c маленьким RAM-диском, в котором лежат драйвера устройств. Тот самый initrd. В этот маленький архив складывают специфичные драйвера SCSI- и RAID-контроллеров, чтобы была возможность разместить корневой раздел на RAID-массиве или SCSI-диске.
Похоже, набор модулей, подгружаемый инсталлятором, несколько побольше и включает модули, которые позволяют видеть microSD. Снова загружаю инсталлятор, перебирая комбинациями клавиш (Ctrl-Alt-F1, Ctrl-Alt-F2) терминалы, и нахожу тот, в котором можно понабирать команды.
Командой lsblk узнаю, что microSD определилась как mmcblk2. Дальше командой lsmod | grep mmc ищу модули, которые отвечают за mmc.
Дополнительно просто копаюсь в списке модулей и выбираю те, которые мне понравились (по ощущениям, их тоже нужно подгрузить, ну так, на всякий случай, чтобы второй раз не вставать), потом выверю список. Честно. :)
В итоге получается так:
sdhci
sdhci-acpi
mmc_core
mmc_block
dw_dmac_core
dw_dmac
i2c_designware_platform
i2c_designware_core
Теперь надо добавить эти модули в Init RAM Disk. В дистрибутивах RPM Based сейчас чаще всего используется утилитка dracut, в дистрибутивах на Debian, кажется, mkinitramfs.
Создаю в /mnt директорию sd:
mkdir /mnt/sd
Дальше монтирую в эту директорию / c sd-карточки:
mount /dev/mmcblk2p1 /mnt/sd
А потом монтирую /boot, который ранее разместил на встроенном flash:
mount /dev/mmcblk0p6 /mnt/sd/boot
Ну, и меняю корень на /mnt/sd:
chroot /mnt/sd
Теперь можно и dracut запустить, чтобы собрать Init RAM Disk с нужными модулями:
dracut -f --force-drivers «sdhci sdhci-acpi mmc_core mmc_block dw_dmac_core dw_dmac i2c_designware_platform i2c_designware_core»
Перезапускаю систему через Ctrl-Alt-Del. Победа! Система загружается. Теперь надо добавить на постоянку в конфигурацию dracut, чтобы после обновления ядра не отвалился снова корневой раздел.
Создаю файл /etc/dracut.conf.d/11-mmc.conf,
в него вписываю драйвера:
add_drivers+=«sdhci sdhci-acpi mmc_core mmc_block dw_dmac_core dw_dmac i2c_designware_platform i2c_designware_core»
Готово.
Настройка оборудования: экран
Первым делом после перезагрузки надо решить проблему с повернутым экраном. Шея болит, сидеть с повернутой набок головой уже надоело.
Начну с простого: надо повернуть экран в графическом режиме. Кнопкой Win открываю меню запуска программ, затем консоль. Командой xrandr ищу, куда подключен экран — DSI-1.
Открываю файл /etc/X11/xorg.conf.d/50-monitor.conf.
Раскомментирую секцию настроек монитора и подставляю идентификатор монитора DSI-1. Ну, и добавляю настройку ротации экрана вправо.
Section «Monitor»
Identifier «DSI-1»
Option «Rotate» «right»
EndSection
Перезагрузка. Все, шею можно выпрямлять. Теперь надо бы и в неграфической консоли экран повернуть.
Открываю /etc/default/grub и в переменную GRUB_CMDLINE_LINUX добавляю fbcon=rotate:1
Дальше командой grub2-mkconfig -o /boot/grub2/grub.cfg пересобираю конфигурацию GRUB. Все, теперь шея не будет болеть и при работе в текстовой консоли.
Настройка оборудования: сеть
Теперь одна из главных задач — поднять сеть. Чтобы не возиться с поиском драйвера по айдишникам оборудования, загружаюсь в Windows и выясняю, что сетевой адаптер — это rtl8723ds. Драйвер, слава Интернету, есть. Сделан энтузиастами и его можно собрать из исходников: https://github.com/lwfinger/rtl8723ds.git
Копирую исходники на флешку и переношу на планшет. Дальше вроде бы все просто:
make
make install
Но ничего не собирается. Не хватает заголовочных файлов. Как-то так получилось, что у меня версия ядра выше, чем версия пакета с исходниками ядра и заголовочными файлами. Проверить можно так:
uname -a
sudo zypper info kernel-default-devel
Решение: подключаю телефон как USB-модем и скачиваю все нужные пакеты. Драйвер собрался, сеть заработала.
Помните, я выше писал, что с отключением Secure Boot мне повезло? Вот почему: после одной из перезагрузок я решил вернуть Secure Boot, но после его включения перестала работать сеть. Покурив форумы, нашел ветку с точно такой же проблемой работы драйвера в сочетании с Secure Boot. И решения пока не найдено.
Настройка оборудования: тачскрин
Теперь пришло время запустить тачскрин. Какой тачскрин установлен, можно тоже подсмотреть в Windows. Благо, энтузиасты и здесь не остались в стороне. Клонирую репозиторий: https://github.com/onitake/gslx680-acpi.git
make
make install
Перезагрузка, не работает. В dmesg — ошибка подгрузки firmware. Дело в том, что контроллер тачскрина универсальный, а в прошивке указываются параметры конкретного экрана и модели. Сами прошивки и утилиты по работе с ними есть в репозитории: https://github.com/onitake/gsl-girmware.git
При попытке подсунуть firmware от другой модели тачскрин заработал, только координаты были сбиты напрочь. Придется делать свою прошивку. Монтирую раздел c Windows и в драйверах в директории windows ищу файл SileadTouch.sys. Дальше скармливаю файл драйвера утилите scanwindrv из репозитория gsl-firmware.
gsl-firmware/tools/scanwindrv ./SileadTouch.sys
На выходе получается файл firmware_00.fw из драйвера Windows. После чего другой утилитой gsl-firmware/tools/fwtool генерирую firmware для драйвера на Linux. Набор параметров экрана пришлось подыскивать методом тыка. Я делал это так: нажимал на экран в левом нижнем углу и в режиме выделения тянул рамку в правый верхний угол. Если рамка отставала от пальца, то корректировал размер в плюс, если обгоняла — в минус.
Копирую firmware:
cp silead_ts.fw /lib/firmware/
cp silead_ts.fw /lib/firmware/silead/silead_ts.fw
cp silead_ts.fw /lib/firmware/silead/mssl1680.fw
Тачксрин работает, можно уже установить виртуальную клавиатуру и посидеть в ютубчике? Не получится: звука нет, Bluetooth не работает.
Настройка оборудования: звук и Bluetooth
На самом деле запустить встроенный звук было проще всего. Ровно одна команда:
zypper install sof-firmware
Судя по описанию чипа сетевой карты, Bluetooth в нее встроен. Драйвер уже установлен, значит, надо копать, почему Bluetooth не запускается.
Команда dmesg | egrep »(Blue|blue|rtl)», чтобы посмотреть все ошибки, связанные с Bluetooth: снова не хватает Firmware, благо, на этот счет уже побеспокоились ребята из комьюнити дистрибутива Armbian.
Клонирую репозиторий https://github.com/armbian/firmware.git, копирую файлы:
cp firmware/rtl_bt/rtl8723_ds* /lib/firmware/rtl_bt/
При загрузке драйвер пытается подгрузить конфиг из файла rtl8723ds_config-OBDA8723.bin, делаю символьную ссылку.
ln -s rtl8723ds_config.bin rtl8723ds_config-OBDA8723.bin
Тут обратите внимание, что O в имени файла rtl8723ds_config-OBDA8723.bin — буква, а не ноль. Пока не понял, проковырялся где-то час, матерясь и не понимая, почему не подтягивается конфигурация. Перезагружаюсь, Bluetooth работает. Почти победа, только инверсированная мышь раздражает.
Настройка оборудования: мышь (не побеждено)
Пришло время разобраться с инвертированной мышью. Первым делом, по заветам Интернета, пробую решить проблему через настройку InputClass в X. Безрезультатно. Никакие Option «InvX » «true » и Option «InversionX» «true » не срабатывают. Промучавшись несколько часов, перехожу в итоге к гайдам с методами, выглядящими как-то «костыльно».
Есть утилитка xinput, которая позволяет управлять опциями устройств ввода. В том числе есть матрица трансформации координат мыши. Похоже, с помощью этой матрицы можно трансформировать координаты мыши не только под прямыми углами, используя дробные числа.
И вроде даже получилось заставить курсор двигаться правильно такой вот командой:
xinput set-prop 13 --type=float «Coordinate Transformation Matrix» -1 0 1 0 -1 1 0 0 1
Только, к сожалению, клики мыши остались инвертированными.
Попробую копать в сторону xinput. Оказывается, в X можно теперь создать несколько курсоров и «цеплять» их к разным устройствам. Это ли не мечта детства — погонять с товарищем в «Героев», да так, чтобы не передавать друг другу мышку и не ругаться о том, у кого ладони потные.
Пробую. Ничего себе — работает. На экране теперь два курсора, один стоит на месте, другой двигается в нужном направлении. Еще немного подкостылю, с помощью xdotool буду сдвигать курсор за пределы экрана.
Получается вот такой костыльный скриптик:
#!/bin/bash
xdotool mousemove 1000000 100000
xinput create-master mymouse
xinput reattach «SIGMACHIP USB Keyboard Mouse» «mymouse pointer»
xinput reattach «Silead GSLx680 Touchscreen» «mymouse pointer»
Добавляю этот скриптик в автозагрузку KDE. Вроде работает, но «такое»: в некоторых приложениях новый курсор ведет себя странно, а иногда старый внезапно выскакивает из зоны невидимости. В общем, костыль получился совсем кривой. Но исследовательский запал исчерпан, хочется уже полежать с планшетом на диване, а допилить все немного позже. Надеюсь, что-то из этой статьи будет кому-нибудь полезно.