Привет всем! Некоторое время назад я приобрёл себе Chromebook модели Toshiba Chromebook 2 CB35-B3330 и заменил на нём Chrome OS на традиционный GNU/Linux. Это была не установка через crouton, а именно «чистая» установка с полным удалением Chrome OS. Борьба с плохой поддержкой Линуксом этого хромбука заняла неожиданно много времени (несколько вечеров), но в итоге все проблемы решились и хромбук стал полноценной рабочей машиной.
В итоге я решил написать статью, в которой:
- Очень кратко описан сам хромбук и мои впечатления от железа.
- Описаны основные проблемы по установке GNU/Linux на данную конкретную модель и пути их решения.
- Очень кратко описано, каким образом я сам его использую после установки Линукса.
Здесь и далее красным отмечены распространённые неправильные решения по настройке, жёлтым — работающие, но некрасивые (костыли), зелёным — правильные.
Toshiba Chromebook 2
Модель CB35-B3330 построена на бюджетном чипе (SoC) Intel Baytrail N2840. Основные характеристики:
- CPU: 64 бит Intel Celeron, 2 ядра, 2.16 GHz, 1Мб L2 кэш
- Оперативная память: 2 GB DDR3L SDRAM
- Видео: встроенный адаптер Intel HD graphics
- Дисковая память: 16 GB eMMC (большинство спецификаций нагло врёт, что это SSD)
- Дисплей: 13.3" матовый 1366x768
- Wi-Fi: 802.11 A/C
- Вес: 3 фунта (1.3 кг)
- Линейные размеры: 12.60 x 8.40 x 0.76 дюймов
Плюсы: ноутбук очень лёгкий и компактный. Довольно симпатичный — цвета металлик с рифлёной поверхностью, собран аккуратно. В нём пассивное охлаждение, так что шума он не издаёт от слова «совсем». В силу слабого железа у него очень низкое энергопотребление (2.5 — 5 Вт) и большое время работы при питании от батареи. Производитель заявляет 13 ч работы, индикатор батареи в Chrome OS это в целом подтверждает, а после установки линукса, ради интереса поотключав всё ненужное и слегка приглушив яркость, я получил прогноз в 24 часа работы без нагрузки и 16-18 часов с нагрузкой текстовый редактор + аудиоплеер + веб-браузер + просмотрщик pdf:
Очень большим плюсом является низкая стоимость. Эта модель стоит в США в районе 150-200$ за восстановленный или б/у вариант, и 230-250$ за новый. Замечу, что многие Chromebook-и схожих характеристик от других производителей, в частности от HP и Acer, даже дешевле этой модели.
Минусы: ИМХО основной минус — это низкокачественный дисплей (TN, низкое разрешение и белёсая поверхность). У этого хромбука есть старший брат — Toshiba Chromebook 2 CB35-B3340 с FullHD IPS дисплеем и чуть более мощным железом, и вот он, похоже, является почти идеальным хромбуком.
Слабое железо и ограниченный объём ОЗУ и диска исключают многие сценарии использования.
Очень неприятен также тот факт, что Toshiba делает вид, что к хромбукам, ей произведённым, она не имеет никакого отношения. На офсайте Toshiba моделям Toshiba Chromebook посвящены пустые страницы без спеков с куцым руководством пользователя.
Ещё одним минусом этого хромбука является его полное отсутствие в продаже в России, так что к цене можно сразу прибавлять стоимость доставки из-за рубежа или искать обходные пути. (Но это общая проблема — по неизвестной мне причине хромбуки почему-то почти полностью исчезли из продажи в России в последние года 2-3).
Установка и настройка Slackware Linux 14.2
Проблемы при установке
Установка происходит примерно как и для любого другого линукса на любой другой лэптоп, за исключением пары тонкостей:
- Насколько мне известно, загрузчик, размещённый на eMMC накопителе, будь то GRUB или LILO, будет работать только в случае UEFI. В случае BIOS + MBR он установится на eMMC, но работать не будет. К сожалению, рутованный хромбук с выключенной OS Verification = SeaBIOS от John Lewis = отсутствие UEFI. В этом я не уверен и буду рад, если кто-то меня разубедит или подскажет способ подписать загрузчик сторонней ОС, но пока у меня это не получилось.
Выход один — размещать загрузчик на MBR стороннего носителя, например флешки, и грузиться с флешки.
Правильным способом являлось бы использование UEFI.
- Загрузочные диски некоторых дистрибутивов будут ругаться на нехватку памяти и не смогут стартовать. Это верно и для многих других хромбуков. Для разрешения проблемы надо сообщить загрузчику параметр ядра mem=1G.
Проблемы с модулем byt-max98090 и нерабочий звук
Бич всех хромбуков на чипе Baytrail. Обсуждения в Интернете про нативную установку Линукса на такие хромбуки пестрят сообщениями «не работает звук» (пример). Чаще всего это происходит по следующим причинам.
Во-первых, byt-max98090 (модуль ядра, отвечающий за звук из колонок и наушников) не входит в стандартную сборку ядра большинства дистрибутивов. (Пример дистрибутива, включающего byt-max98090, — Ubuntu.) Если этого модуля нет, звука из колонок и наушников естественно не будет ни при каких условиях и нужно будет пересобирать ядро с включением byt-max98090. Проверить наличие этого модуля в системе можно несколькими способами:
— В конфиге ядра должно стоять CONFIG_SND_SOC_MAX98090=m.
— Команда lsmod должен выдавать этот модуль в списке прочих (если он загружен).
Во-вторых, что ещё хуже, byt-max98090 не работает во многих новых релизах ядра. Методом тыка и веб-поиска я выяснил следующее:
- Chrome OS, установленная на этот хромбук (Swanky), основана на ядре 3.10.19. В ней, естественно, звук работает.
- Для ядер версии 4.x, в GNU/Linux звук работает в lts релизе 4.4.23 и более ранних.
- Версия 4.5 внесла фундаментальные изменения в подсистему звука и модуль byt-max98090 перестал работать (пруф). Неработа byt-max98090 в новых ядрах выглядит примерно так (в dmesg):
выхлоп dmesg
[ 6.001164] byt-max98090 byt-max98090: ASoC: CPU DAI baytrail-pcm-audio not registered [ 6.001298] byt-max98090 byt-max98090: snd_soc_register_card failed -517 [ 6.041935] baytrail-pcm-audio baytrail-pcm-audio: FW version: 04.05.13.a0 [ 6.042029] baytrail-pcm-audio baytrail-pcm-audio: Build type: a0 [ 6.042129] baytrail-pcm-audio baytrail-pcm-audio: Build date: Apr 2 2014 14:14:39 [ 6.046272] usb 1-3: new high-speed USB device number 2 using xhci_hcd [ 6.066088] max98090 i2c-193C9890:00: MAX98090 REVID=0x43 [ 6.070340] max98090 i2c-193C9890:00: use default 2.8v micbias [ 6.072733] sst-acpi 80860F28:00: ASoC: Cannot get gpio at index 1: -2 [ 6.072888] byt-max98090 byt-max98090: ASoC: failed to init Baytrail Audio: -2 [ 6.073021] byt-max98090 byt-max98090: ASoC: failed to instantiate card -2 [ 6.073251] byt-max98090 byt-max98090: snd_soc_register_card failed -2 [ 6.073354] byt-max98090: probe of byt-max98090 failed with error -2
- Эта ситуация, видимо, продолжается до настоящего времени. Я собрал 4.12.0 и звук у меня не заработал, причём с теми же симптомами, что и в 4.5 и в более поздних.
TL;DR: 4.4.23 — звук работает, в любом следующем релизе ядра — нет.
В-третьих, даже если поставить byt-max98090 и ядро нужной версии, звук из коробки не работает — необходимо произвести пару действий с выгрузкой модулей ядра (см ниже) и выставить некоторые нужные настройки ALSA. На этом этапе обычно дают некорректный совет использовать другой дистрибутив или использовать asound.state из Chrome OS (причём такие советы замечены даже за такими гуру, как John Lewis — автором самой известной SeaBios прошивки для хромбуков). Такой совет в принципе может сработать, но является чистым шаманством, потому что если в одном дистре звук работает, а в другом нет, это значит что проблема или в различных сборках ядра, или в различных конфигах alsa/pulseaudio, других ситуаций быть не может. То же самое с asound.state. Asound.state — это просто снимок настроек alsa. Всё, что кто-то другой выставил в своём asound.state, можно выставить у себя через утилиту alsamixer или в более низкоуровневой alsactl, не копируя asound.state ниоткуда никуда.
Так вот, следующие действия включают звук на baytrail хромбуке и не требуют менять дистрибутив или копипастить asound.state:
- Убедиться, что находимся в стартовой ситуации, когда звук не работает:
aplay -D sysdefault:CARD=bytmax98090 /usr/share/sounds/alsa/Noise.wav > ALSA lib pcm_dmix.c:1030:(snd_pcm_dmix_open) unable to open slave > aplay: main:786: audio open error: No such file or directory
- Выгрузить все модули звуковых устройств (их в этом хромбуке два — bytmax98090 и HDMI, в каждом конкретном случае ещё могут быть внешние устройства):
modprobe -r snd_soc_sst_byt_max98090_mach snd_hda_codec_hdmi
- Убедиться, что список звуковых устройств пуст:
aplay -L
- Создать ~/.asoundrc со следующим содержимым:
.asoundrc
pcm.!default { type hw card 0 } ctl.!default { type hw card 0 }
- Загрузить модуль byt-max98090.
modprobe snd_soc_sst_byt_max98090_mach
- Запустить alsamixer.
- Убедиться, что speaker не на mute (нет MM под ползунком speaker. Включается клавишей M).
- Снять с mute устройства «Left Speaker Mixer Left DAC» и «Left Speaker Mixer Right DAC».
Аналогичные устройства есть для выхода наушников. Обратите внимание, что звук в динамиках и звук в наушниках конфигурируется независимо — это скорее всего баг.
- Проверить, что звук появился.
Эти действия — очевиднейший костыль с выдёргиванием-вставкой звуковых модулей, призванный решить неправильный порядок инициализации звуковых устройств при загрузке. Правильным решением было бы исправление кода ядра, так чтобы звук работал из коробки, но ИМХО это вряд ли исправят в ближайшем будущем.
Обход проблемы частой перезаписи eMMC
Очень распространённая проблема как для этого хромбука, так и для многих других. Внутренний накопитель на нём — это впаянный в плату eMMC, а значит — его невозможно заменить в домашних условиях и время жизни хромбука равно времени жизни этого накопителя. А у него, как и у любого MMC, очень ограниченный запас циклов перезаписи. Для Chrome OS этой проблемы нет, тк она каждый раз распаковывается из фиксированного образа в память и почти не пишет на накопитель, но обычный Линукс постоянно производит запись на диск: в логи, в домашний каталог и т.д. Есть несколько решений этой проблемы:
- Использование полностью initrd-based дистрибутива (Finnix, Puppy Linux) — сложно из-за лимита в 2 Гб.
- Формирование своего initrd со всем нужным софтом — сложно из-за лимита в 2 Гб и необходимости понимать, какие системные компоненты класть в initrd — udev, менеджер пакетов...).
- Установка дистрибутива на SD карту или USB флешку. Единственным недостатком является низкая скорость чтения с накопителя, но есть и огромное преимущество — простота, так как установка ничем не отличается от обычной установки на жёсткий диск, не говоря уже о низкой цене на SD карты и флешки.
- Гибридный способ (выбранный мной): Обычная установка на внутренний 16Гб накопитель, но с монтированием самых часто записываемых разделов в память.
Самые активно используемые каталоги — это /home и /tmp, поэтому у меня следующий /etc/fstab:
/dev/mmcblk0p1 / ext3 defaults 1 1 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0 tmpfs /home/cheater tmpfs defaults,noatime,nosuid,size=800m 0 0 tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0 tmpfs /var/cache tmpfs defaults,noatime,nosuid,mode=0755,size=190m 0 0 tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0 tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=80m 0 0 tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0 tmpfs /var/spool/mqueue tmpfs defaults,noatime,nosuid,mode=0700,gid=12,size=30m 0 0
Так как файлы, размещаемые в ОЗУ, живут только до отключения питания, приходится регулярно делать бэкапы этих файлов куда-нибудь в более надёжное место, например на тот же внутренний накопитель, на домашний сервер или в облачное хранилище. Как это реализовать — каждый решает для себя, универсального рецепта тут быть не может.
Добавлю, что полное отключение питания на ноутбуке — это крайне редкое событие, проще при необходимости отправлять ноутбук в сон или гибернацию. Принудить выключить лэптоп может разве что необходимость обновления ядра, kernel panic или разрядка батареи в ноль. (Я выключал свой хромбук только в первые 2-3 недели после покупки, пока ещё не устоялось окружение, после этого не выключал ни разу, только отправлял в сон). Ещё одно важное замечание — установив Linux, нельзя ни в коем случае допускать полной разрядки хромбука, так как это приводит к переходу хромбука в Recovery Mode.
Правда, есть ещё одна неприятная причина выключения, о которой следующий пункт —
Кнопка Power, уязвимая для случайных нажатий
Я до сих пор не понимаю, чем руководствовались создатели этого хромбука (который по идее не надо выключать почти никогда) и всех остальных хромбуков, делая кнопку Power обычной клавишей клавиатуры рядом с Backspace.
В нормальных лэптопах Power — это крохотная кнопка где-то в стороне, которую невозможно нажать случайно. На хромбуке же, чтобы случайно нажать на Power, достаточно промахнуться по Backspace или соседней F-клавише.
Выход один — софтверно отключить или переназначить Power. Это не лишает возможности выключать ПК, т.к. во-первых, это всегда можно сделать из консоли через /sbin/init 0, poweroff и т.д., а во-вторых, комбинации «Esc+Power+F3» (перезагрузка в recovery mode) и «удерживать Power 5 секунд» (отключение) действуют абсолютно всегда — они обрабатываются на уровне BIOS-а хромбуков.
Для дистрибутивов, основанных на systemd, это очень просто делается в настройках systemd:
достаточно выставить HandlePowerKey=ignore в /etc/systemd/logind.conf и перезапустить systemd-logind или ПК.
Для прочих дистрибутивов (среди которых и Slackware) обработка ACPI события «нажата кнопка power» задаётся в /etc/acpi/handler.sh:
case "$1" in
button)
case "$2" in
power)
# /sbin/init 0
logger "Power button is hit"
;;
*) logger "ACPI action $2 is not defined"
;;
esac
;;
*)
logger "ACPI group $1 / action $2 is not defined"
;;
esac
Search вместо Caps Lock
Ещё одна родовая травма хромбуков. Клавиши Caps Lock на них нет, вместо неё кнопка Search. Без переключения регистра капсом как-нибудь можно прожить, но проблема в том, что многие линуксоиды используют Caps Lock для смены раскладки и хотелось бы иметь клавишу Search, работающую как Caps, чем мы сейчас и займёмся.
Эта клавиша распознаётся не как медиа-клавиша поиска (XF86XK_Search), как можно было бы ожидать, а как левая Win-клавиша. Поэтому кому лень выполнять долгие настройки, можно просто забить LWin на переключение раскладки в настройках DE или xkb по вашему выбору.
Настройка через xkb делается (в моём случае) так:
vi /usr/share/X11/xorg.conf.d/90-keyboard-layout.conf
И добавляем опцию:
Option "XkbOptions" "grp:lwin_toggle"
Способ не совсем идеальный, тк:
- во-первых, в идеале всё же желательно, чтобы Search работал как Caps на уровне скан-кодов (например у нас есть большая самодельная раскладка для xmodmap, в которой много комбинаций с капсом, и не хотелось бы все их переписывать).
- во-вторых, в XkbOptions нет возможности настроить Shift+Lwin на переключение на русскую раскладку (довольно много линуксоидов так делает — переключает раскладку не капсом, а забивает caps на английскую раскладку и shift+caps на русскую). Следовательно, для тонкой настройки всё равно придётся идти в xmodmap.
Итого, правильный способ — перезабить LWin на Caps на низком уровне xkb, в xmodmap. Маппинг xmodmap каждый настраивает в своём месте (~/.Xmodmap, стартовый скрипт...), но действие всюду одно и то же:
keysym Super_L = Caps_Lock
Замечание: Всё сказанное про клавиатуру относится только к настройке клавиш под X-сервером (xkb). В консоли используется другие утилиты (в Slackware они представлены пакетом kbd) и основным средством перезабивания клавиш является loadkeys. Настройка kbd в статье рассмотрена не будет.
Сценарий использования
Про работу на этом ноуте со стоковой Chrome OS рассказывать особо нечего — там всё то же самое, что и в любом другом хромбуке и на эту тему десятки статей и роликов. Центральной частью системы для пользователя становится браузер Chrome. Приложений в классическом понимании нет — в качестве них выступают плагины к Chrome и веб-сервисы, открываемые в браузере. Среди привычных — GMail, Google Docs, Google Drive, Hangouts. Если покопаться в плагинах, можно найти SSH клиент, VNC клиент, RDP клиент, Samba клиент, разнообразные редакторы текста, графики и т.д. Быстродействие и функциональность таких плагинов, как правило, в районе плинтуса. В теории, можно ставить и нативные приложения через замену Chrome OS на Chromium OS и перепаковку образа, но это развлечение только для сильных духом, и явно выходит за рамки данной статьи. Работает всё без особых тормозов, Chrome исправно грузит страницы, играются фильмы и музыка, хотя набор видео- и и аудиокодеков далеко не полный и некоторые форматы проигрывать нельзя (и, в отличие от десктопных ОС, доустановить кодеки нет никакой возможности).
В Developer Mode всё несколько веселее, появляется доступ к bash, файловой системе и работе под рутом. В такой среде самым прямолинейным способом расширения функциональности хромбука является chroot в корневой каталог с обычным линуксом (на флешке или на внутреннем накопителе), что как раз и делает известная утилита crouton. На сегодняшний день актуальны более современные, чем chroot, средства контейнеризации, такие как LXC, но о возможности/трудоёмкости их использования в рутованном Chrome OS мне ничего не известно.
Более фундаментальной модификацией хромбука является полное удаление Chrome OS с накопителя и установка своей ОС (Здесь и далее буду предполагать, что это Линукс, хотя на деле, естественно, есть и другие варианты).
Что получает пользователь, поставивший нативный GNU/Linux:
- Свободную ОС с полным контролем над ней;
- Все аппаратные ресурсы хромбука, в отличие от chroot/crouton, и более просто устроенную среду;
- Привычную корневую систему с возможностью записи (в отличие от Chrome/Chromium OS, распаковывающимся из readonly образа каждый раз). У этого подхода есть и минусы, но как минимум он проще и привычнее;
- Полный набор привычных десктопных приложений вместо имитирующих их хромовских плагинов.
- Значительно меньшую зависимость от Интернета, если полагаться на локальные приложения и данные.
На моём лэптопе реализован именно этот вариант — установлена «чистая» Slackware 14.2.
Инструментарий довольно аскетичный, так что требования к мощности лэптопа очень низкие. Графическая среда — dwm, небольшой тайловый оконный менеджер на C. Практически все приложения, которыми я пользуюсь, используют текстовый интерфейс. Центральным среди них является Emacs — в нём я пишу код и любой текст, читаю электронную почту и RSS (Gnus), общаюсь в jabber и irc, веду заметки и планы дел (Org-mode), посещаю текстовые веб-страницы (w3m). Других пользовательских приложений немного, основные — это dwm (веб-браузер), mpd + ncmpc (музыка), zathura (средство просмотра pdf, djvu и т.д.) и TeX Live (система вёрстки математических текстов). Иногда смотрю фильмы (mplayer) и играю в игры, такие как Warsow, ADOM, Aquaria и Вангеры. Разработку веду в основном на C++, Perl, C.
Мощности хромбука для перечисленного софта хватает. Притормаживать он начинает на веб-страницах, активно использующих js и флеш, и к сожалению почти на всех играх, кроме совсем уж минималистичных (Aquaria, Вангеры, и естественно ADOM).
Система со всем инструментарием (названные выше приложения, TeX, Perl, GCC и все сопутствующие средства разработки) занимает 2.7 Гб из доступных 16 Гб, остальное место пока никак не используется. Все данные большого объёма (медиафайлы, бэкапы, образы виртуалок) и вообще все перманентные данные хранятся на домашнем сервере, к диску которого я подключаюсь по sshfs или nfs. Локально на хромбуке я обычно храню только то, с чем работаю на текущий день — обычно это пара книг, копия содержимого почтового ящика, копии 2-3 репозиториев с кодом и копия базы Org-mode. В начале и в конце рабочего дня синхронизируюсь с сервером. Таким образом, хромбук получает очень высокую автономность, невозможную в Chrome OS.
Автор: Oleg