Как пропатчить планшет под OpenSuSE

Всем привет, меня зовут Иван. Хочу поделиться опытом, который может пригодиться тем, кто захочет сделать такую же странную вещь, как и я, — установить OpenSuse на планшет с Windows.

Наступила осень, на улице холодно и мокро, велосипед поставлен на зимовку. Хочется сидеть на диване и серфить в Интернете под расслабляющую музыку. А где проблема? А она в том, что планшет был пожертвован детям, а жена свой не даст. Значит, пришло время прикупить новый.

c7ffd7fe52958591e6cdcf353134c3e0.jpeg

Муки выбора и «хитрый» план

Решение принято, но что брать? Наступает тот самый момент, когда гик должен выбрать новый девайс. Скажу честно: продукцией 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, чтобы поменять порядок загрузки, и сталкиваюсь с первым приколом — экран повернут набок. Немного поразмышляв о сооружении системы зеркал, чтобы «выпрямить» картинку, решаю, что пока потерплю.

189f4cfc4672920550e6c33d4426d232.png

В меню загрузки менять ничего не пришлось: USB-устройства и так идут первыми. Запускаю инсталлятор, снова получаю повернутый экран и еще одну проблему: сетевых устройств не найдено, и по сети систему не поставить. Деваться некуда, качаю офлайн-инсталлер. 

82593b2844a4b4c7912793edb4503e13.png

Попытка 2: опять мимо

Имидж скачан и залит на флешку, запускаю установку — и снова получаю повернутую картинку, а еще инвертированную мышь и неработающий тачпад.

7b64e5054b3ca3447511167a5f71dfa3.png

Перемещаться по кнопкам можно с помощью 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.

48a823e677cbafde7a5a91ce2e31231d.png

Победа? Нет. Не монтируется /. Меня встречает печальная консоль Single User. Так, если инсталлятор видел microSD, а установленная система — нет, проблема понятна: ядро Linux при запуске монтирует специальный CPIO-архив c маленьким RAM-диском, в котором лежат драйвера устройств. Тот самый initrd. В этот маленький архив складывают специфичные драйвера SCSI- и RAID-контроллеров, чтобы была возможность разместить корневой раздел на RAID-массиве или SCSI-диске.

3234603df85c8de2d99be4c096970fd1.png

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

Готово.

Настройка оборудования: экран

Первым делом после перезагрузки надо решить проблему с повернутым экраном. Шея болит, сидеть с повернутой набок головой уже надоело.

dc8f08ba0e3126c9d1709762953d6d53.jpeg

Начну с простого: надо повернуть экран в графическом режиме. Кнопкой 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. Набор параметров экрана пришлось подыскивать методом тыка. Я делал это так: нажимал на экран в левом нижнем углу и в режиме выделения тянул рамку в правый верхний угол. Если рамка отставала от пальца, то корректировал размер в плюс, если обгоняла — в минус. 

b6cacdf054debbd7368f3d612ac0740a.png37998d3318aa53fd42ebf25ef2c6d120.png

Копирую 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. Вроде работает, но «такое»: в некоторых приложениях новый курсор ведет себя странно, а иногда старый внезапно выскакивает из зоны невидимости. В общем, костыль получился совсем кривой. Но исследовательский запал исчерпан, хочется уже полежать с планшетом на диване, а допилить все немного позже. Надеюсь, что-то из этой статьи будет кому-нибудь полезно. 

© Habrahabr.ru