Debian Stretch и новое ядро на Cubietruck

Сидел как-то я, обновлял Debian на Cubietruck и вдруг в голову пришла мысль - а когда следующая версия? Наверное, в следующем году должна выйти. Полез в Википедию, удовлетворить своё любопытство. Как оказалось, уже полгода, как вышла.

Начал искать статьи про обновление до Debian Stretch, вдруг какие-нибудь подводные камни вылезут, все таки не rolling-release, как, например, Gentoo.

Нашёл эту статью. В принципе, ничего не изменилось, ничего сложного.

Обновился, но вот вылезла такая проблема - не запускался Apache, MySQL, TOR, и еще какой-то сервис. При запуске Apache выдавал такую ошибку:

systemd: apache2.service: Control process exited, code=exited status=226

Failed at step NAMESPACE spawning /usr/sbin/httpd: Bad file descriptor
Aug 27 22:48:39 cubie2 systemd: apache2.service: Main process exited, code=exited, status=226/NAMESPACE

На Cubieforums нашёл тему, у человека была такая же проблема, только не было решения.

А решение относительно простое - нужно обновить ядро. Начнём с того, что изначально на Cubietruck был установлен Cubian. Но постепенно я переехал на Debian Jessie, т.к. Cubian перестал обновляться. И при обновлении с Cubian/Wheeze до Jessie так же пришлось обновлять ядро, про это я уже писал.

Инструкция ниже, это смесь из нескольких статей с linux-sunxi.org - Mainline Kernel Howto, Display, и инструкции Miklós Aurél Rónai - Compiling mainline kernel for CubieBoard2 and CubieTruck ну и немного моих знаний 😉

Мой Cubietruck используется исключительно как домашний сервер, поэтому мультимедийные опции в ядре мне не нужны. По поводу загрузки - система начинает загружаться с SD карты, дальше загрузка идёт с HDD. Так же через USB подключён внешний жёсткий диск.

Я сначала опишу процесс сборки ядра и загрузчика, а уже потом будет подготовка SD карты для работы.

Всё делается на Cubietruck'e через SSH. Создаём директорию src для удобства работы и переходим в неё:

mkdir src && cd src

Прежде всего, установим U-boot:

wget ftp://ftp.denx.de/pub/u-boot/u-boot-2017.11.tar.bz2
bzip2 -d u-boot-2017.11.tar.bz2
tar xf u-boot-2017.11.tar
cd u-boot-2017.05
make Cubietruck_defconfig
make

Пока с u-boot всё. Переходим обратно в директорию src, скачиваем исходники ядра и распаковываем их:

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.68.tar.xz
xz -d linux-4.9.68.tar.xz
tar xf linux-4.9.68.tar

Устанавливаем пакеты для сборки ядра:

apt install gcc build-essentials swig libpython-dev libfdt-dev gcc-6-plugin-dev libncurses5-dev

Переходим с каталог linux-4.9.68 и конфигурируем ядро перед сборкой:

cd linux-4.9.68
make ARCH=arm sunxi_defconfig

Обязательно нужно поставить ARCH=arm перед menuconfig, иначе пропадут все специфичные для arm опции (следовательно, ядро не загрузится). Если забыли - нужно снова выполнить make ARCH=arm sunxi_defconfig

make ARCH=arm menuconfig

Ядро нужно обязательно сконфигурировать, по умолчанию в этой конфигурации нет поддержки NFS-сервера, устройств хранения USB, фреймбуфера, Bluetooth, Wi-FI, PPPoE, поддержки мыши, батареи и т.д. В общем много чего отключено по умолчанию.

Так же нет поддержки NAND - обязательно включите, если система загружается с NAND, а не с SD карты Device Drivers > Memory Technology Device (MTD) support > NAND Device Support > Support for NAND on Allwinner SoCs (*). Обязательно должен быть в ядре, а не собран модулем.

NFS сервер:

File Systems > Network File Systems > NFS Server Support (Собираем как модуль (М) или он будет прямо в ядре (*), кому как больше нравится)

Выходим обратно в File Systems, здесь ещё нужно активировать файловые системы, с которыми будет работать Cubietruck. По умолчанию включены лишь Ext4 с поддержкой Ext2 и FAT. Если будут подключаться диски/флешки с другими файловыми системами, их нужно включить здесь.

Работа с USB накопителями:

Device Drivers > SCSI device support > SCSI disk support (*)

Выходим обратно в Device Drivers > USB Support > USB Mass Storage Support (M) - можно собрать и модулем.

Выше можно включить OTG:

OTG Support.

Если не нужна поддержка звука и мультимедии:

Снять галочки с Sound Card Support и Multimedia Support.

Включение Framebuffer в консоли:

Device Drivers > Graphics support > Frame buffer Devices > Simple framebuffer support и в этом же меню включить Support for frame buffer devices > Enable firmware EDID.

В общем всё, настройка закончена, если кому нужно что-то еще подключить\отключить - всё в ваших руках, ничего сложного здесь нет.

Сохраняем конфиг. файл и выходим из menuconfig

Собираем ядро, dts, модули ядра и устанавливаем их:

# make zImage dts modules modules_install

Сборка на Cubietruck с таким конфигом займёт около 3-х часов.

После сборки ядра нужно подготовить SD карту к работе с новым ядром.

Если хотите очистить SD карту, сохранив таблицу разделов:

dd if=/dev/zero of=/dev/mmcblk0 bs=1k count=1023 seek=1

Если хотите очистить SD карту вместе с таблицой разделов:

dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=1

Лично я выбрал первый вариант. Далее, создаём таблицу разделов на SD карте, первый раздел будет смещён на 1МБ от "начала" SD карты (в это место будет записан загрузчик) и размером 16Мб, а второй займёт всё оставшееся место на карте.

blockdev --rereadpt /dev/mmcblk0
cat <<EOT | sfdisk /dev/mmcblk0
1M,16M,c
,,L
EOT

Создаём файловые системы:

mkfs.vfat /dev/mmcblk0p1
mkfs.ext4 /dev/mmcblk0p2

Теперь нужно установить загрузчик (u-boot). Возвращаемся обратно  в директорию u-boot-2017.11:

cd ../u-boot-2017.11

Записываем ранее скомпилированный загрузчик на SD карту:

dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8

Монтируем загрузочный раздел SD карты и копируем туда dtb файл и образ ядра:

mkdir /mnt/bootprt
mount /dev/mmcblk0p1 /mnt/bootprt
cp linux-4.9.68/arch/arm/boot/zImage /mnt/bootprt
cp linux-4.9.68/arch/arm/boot/dts/sun7i-a20-cubietruck.dtb /mnt/bootprt

Переходим в примонтированный загрузочный раздел и создаём файл boot.cmd со следующим содержимым:

fatload mmc 0 0x46000000 zImage
fatload mmc 0 0x49000000 sun7i-a20-cubietruck.dtb
setenv bootargs console=tty0 hdmi.audio=EDID:0 disp.screen0_output_mode=EDID:1920x1080p60 root=/dev/sda2 rootwait panic=10 ${extra}
bootz 0x46000000 - 0x49000000

Поменять здесь можно опцию root - в данный момент она указывает, что корневой раздел находится на /dev/sda2. Опция disp.screen0_output_mode устанавливает разрешение фреймбуфера.

И последняя команда, которая создаёт файл boot.scr:

mkimage -C none -A arm -T script -d boot.cmd boot.scr

Всё, можно перезагружать систему.

Так же можно скачать готовые скомпилированные ядра и модули отсюда. Они для десктопа, с поддержкой всякого - собиралось такое ядро на Cubietruck около 12 часов.

Правда у меня они так и не завелись, возможно я что-то не так делал. Грешу на файл boot.cmd и образ ядра - uImage, а не zImage. Для загрузки uImage ипользуется команда bootm, а я не помню, менял я её или нет 🙂 Попробую ещё на новых версиях, как их выложат.

Установка Qemu и Raspbian

Как и писал в предыдущем посте, приехал до меня Raspberry Pi3. Заказывал на AliExpress, в наборе ещё был внешний бокс, HDMI кабель, радиаторы и блок питания. Ссылка на комплект будет в описании к видео на YouTube, которое я расположу в конце поста.

Брал я его для того, чтобы сделать из него медиацентр посредством Kodi. Но до этого я хотел запустить сам дистрибутив Raspbian на компьютере, чтобы посмотреть, как вообще все это будет работать.

Нашёл статьи по подготовке запуска Raspbian в Quemu - раз и два.

Но в Gentoo подобных дистрибутивах нужно ещё собрать Qemu c флагом QEMU_SOFTMMU_TARGETS="arm"

В принципе в статьях всё подробно расписано, но нужны небольшие изменения. Вот команда запуска уже подготовленного Qemu из вышеприведённых статей, но они немного различаются:

В первой статье написано так:

qemu-system-arm -kernel ./qemu-rpi-kernel/kernel-qemu-4.4.26-jessie -cpu arm1176 -m 1024 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda rpi.img

А во второй так:

qemu-system-arm -kernel /kernel-qemu -cpu arm1176 -m 256 -M versalitepb -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda <путь_к_образу_Rapbian>

Итак, красным обозначены ошибки в опции, синим - правильно написание.

Опция -m задаёт количество выделяемой памяти для виртуальной машины. Но есть одно но - библиотека versatilepb не может работать с больше, чем 256 Мб оперативной памяти, это захардкожено в её коде. Во втором примере написано верно (-m 256), но ошибка в написании имени библиотеки. А строка init=/bin/bash не нужна - с ней не будет загружаться графический интерфейс.

А так всё работает, правда подлагивает 🙂

Ещё нашёл видео на YouTube, где просто и понятно рассказывается про настройку Kodi на Raspberry Pi3.

Raspberry Pi, WordPress и плагин WP Statistics

Хотел написать о покупке Raspberry Pi, но перед этим решил обновить WordPress. Обновил, захожу на страницу обновления плагинов, обновил и их заодно. Перезагружаю страницу для проверки и на тебе - белый экран. Сначала почему-то грешил на тему оформления, что это все из-за неё. Дальше отключил все плагины - страница загрузилась. Путём перебора выяснилось, что проблемы создаёт плагин WP Statistics. И судя по этой ссылке, это ещё цветочки - версия 12.3 жрёт память и отказывается считать статистику. Так что пока пусть будет отключён, до выпуска другой версии.

Запуск The Sims 4 и Origin через Wine

От скуки решил скачать The Sims 4, чтобы устроить там чад кутежа и кровавого угара. Запускается он через Origin, но так как я собирался поиграть от силы пару часов, то скачал взломанную версию.

Вот только при запуске игры вылезает ошибка, что мол Origin не запущен, запустите его и попробуйте снова. Почитал комменты на трекере - у некоторых людей такая же проблема, причём на Windows. Скачал другую раздачу - всё тоже самое. И тут в одной раздаче увидел в комментариях совет - мол, поставьте Origin, но не регистрируйтесь там, просто установите, и когда игра запустится - появится окно Origin для ввода логина и пароля, а дальше пойдёт сама игра.

Лады, скачаю, поставлю. Скачал, давай ставить - запуск установщика крашится, ругаясь на DirectX11, примерно как в игре Beholder. Полез на сайт Wine, там и нашёл решение - нужно создать 32-х битный префикс, скачать Legacy версию Origin, выставить в winecfg совместимость с Windows XP для скачанного файла, и установить его. Legacy версия позволяет только загружать игры, но нельзя просматривать сам магазин игр или бесплатные игры, но нам этого вполне хватит, мы же не собираемся ничего там покупать ;).

После этого The Sims 4 без проблем запускается и работает.

Запуск игры Beholder в Wine

На днях посмотрел ролик, в котором игру Beholder обсуждают Лаврентий Августович и его помощник Шурка:

Заинтересовался, полез посмотреть игру в Steam, оказалось, что это пока открытая бета, ключ можно получить через официальный сайт, сама игра выходит осенью. Вот её краткое описание:

"Вы – управляющий дома, который… ШПИОНИТ за жильцами! Вы ставите жучки, обыскиваете квартиры, прослушиваете телефоны. Вы собираете компромат и строчите доносы. Или… Возможно, у вас есть другой выбор?"

В общем роман "1984" Оруэлла во всей красе. Итак, что нужно сделать, чтобы запустить игру в Linux?

Для начала, обновить Wine. Я пробовал запускать со стабильной версии 1.8.4, но игра выдала такую ошибку:

fixme:d3d:wined3d_get_format Can't find format WINED3DFMT_R16_UNORM (0x55) in the format lookup table

Погуглил и выяснил, что поддержка формата WINED3DFMT_R16_UNORM появилась только в Wine 1.9.3. Но если и обновлятся, то до последней версии, в моём случае это Wine-1.9.19-r1.

После обновления вылезла другая ошибка:

fixme:d3d:wined3d_dxtn_init Wine cannot find the txc_dxtn library, DXTn software support unavailable.

Нужно установить media-libs/libtxc_dxtn, причем я поставил 32-х битную версию, т.к. на одном форуме видел чела с такой же проблемой, но у него была установлена 64-х битная версия. Ему посоветовали поставить 32-ую и проблема решилась.

Практически всё, осталось запустить winecfg, на вкладке Приложения добавить файл Beholder.exe - находится по адресу ~/.wine/drive_c/Program Files (x86)/Steam/steamapps/common/Beholder/ и ещё я выбрал Версию Windows 8, не знаю, может и с Windows XP так же будет работать.

Щелкаем на Beholder.exe в окне Настройка приложений и переходим на вкладку Библиотеки, выбираем из списка d3d11, жмём Добавить, она появляется в окне ниже, щёлкаем по ней, жмём Изменить и в окне выбираем Отключить.

Если не отключить эту библиотеку, то игра запустится, но как только пойдёт ролик в начале, игра закрашится, т.к. Wine пока ещё плохо работает с DirectX11. А так игрушка будет работать через DirectX9.

Приятной игры 🙂

P.S. Почитал обсуждение игры в Steam - разработчики обещают нативную версию под Linux, но чуть позже.

Винил для PS4

Третьего дня приехал винил для PS4, заказанный на известном китайском сайте. Выбрал скин Last of Us, хотя перед этим были метания, что же таки взять - Дарта Вёрдера, Uncharted, God of War, или Last of Us. Сегодня присовокупил к консоли, на ощупь винил приятный, картинка хорошего качества, даже как-то неожиданно.

PS4 винилPS4 винил

Сборка dev-qt/qtwebkit-5.6.0 и создание swap файла

Третьего дня зашел на сайт Calculate Linux и узнал, что месяц назад начался переезд на KDE/Plasma5. Судя по каментам, всё работает более-менее стабильно, поэтому нужно было переезжать, тем более переезд был принудительный, KDE 4 перестал поддерживаться сообществом и всё такое.

И вот, система обновляется, всё нормально, пока дело не доходит до сборки dev-qt/qtwebkit-5.6.0

Выдаёт такую ошибку:

make[2]: Entering directory '/var/calculate/tmp/portage/dev-qt/qtwebkit-5.6.0/work/qtwebkit-opensource-src-5.6.0/Source/JavaScriptCore'
ruby /var/calculate/tmp/portage/dev-qt/qtwebkit-5.6.0/work/qtwebkit-opensource-src-5.6.0/Source/JavaScriptCore/offlineasm/generate_offset_extractor.rb llint/LowLevelInterpreter.asm LLIntDesiredOffsets.h
/usr/lib64/ruby/2.0.0/rubygems.rb:15:in `require': cannot load such file -- rubygems/compatibility (LoadError)
from /usr/lib64/ruby/2.0.0/rubygems.rb:15:in `<top (required)>'
from <internal:gem_prelude>:1:in `require'
from <internal:gem_prelude>:1:in `<compiled>'
Makefile.LLIntOffsetsExtractor:426: recipe for target 'LLIntDesiredOffsets.h' failed
make[2]: *** [LLIntDesiredOffsets.h] Error 1

Засоветовали пересобрать dev-lang/ruby и dev-ruby/rubygems - не помогло. Далее я обратил внимание, что установлено 2 версии ruby - 2.0 и 2.1.7. Переключение профиля  ruby20 на ruby21 через eselect ruby set ruby21 помогло решить проблему.

Но на этом проблемы не закончились. Дальше при сборке выдаёт такое:

x86_64-pc-linux-gnu-g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.gentoo.org/> for instructions.
Makefile.WebCore.Target:151688: recipe for target '.obj/inspector/InspectorAllInOne.o' failed
make[2]: *** [.obj/inspector/InspectorAllInOne.o] Error 4
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/var/calculate/tmp/portage/dev-qt/qtwebkit-5.6.0/work/qtwebkit-opensource-src-5.6.0/Source/WebCore'
Makefile.WebCore:68: recipe for target 'sub-Target-pri-make_first-ordered' failed
make[1]: *** [sub-Target-pri-make_first-ordered] Error 2
make[1]: Leaving directory '/var/calculate/tmp/portage/dev-qt/qtwebkit-5.6.0/work/qtwebkit-opensource-src-5.6.0/Source/WebCore'
Makefile:178: recipe for target 'sub-Source-WebCore-WebCore-pro-make_first-ordered' failed
make: *** [sub-Source-WebCore-WebCore-pro-make_first-ordered] Error 2

Полез на багтрекер Gentoo - пишут, что скорее всего просто закончилась память.

Действительно, dmesg подтверждает:

[27324.991323] Out of memory: Kill process 6800 (cc1plus) score 125 or sacrifice child
[27324.991337] Killed process 6800 (cc1plus) total-vm:1123472kB, anon-rss:1051444kB, file-rss:0kB

Пришлось подключать дополнительно swap-файл, т.к. раздел для него на жёстком диске я просто не создавал, оперативной памяти в 8Гб всегда хватало.

Создаём файл:

sudo dd if=/dev/zero of=/swapfile bs=1G count=6

Заместо G можно подставить M и K, соответственно мегабайт и килобайт.

Значение count умножаются на значение bs, я создал файл размером в 6 гигабайт.

Создаем swap в файле:

mkswap /swapfile

Включаем его:

swapon /swapfile

После подключения swap'a сборка завершилась успешно.

Более подробно про создание, подключение и настройки своппинга написано здесь.

Не воспроизводится видео в Twitter.

Twitter пишет такое - "Воспроизведение видео не поддерживается в этом браузере.". В интернете много советов по этому поводу, мне помог этот - если стоит расширение Flashblock, нужно внести в его белый список 2 адреса -  twimg.com и amp.twimg.com.

Оживить Cubietruck, часть хз какая.

Cubietruck в очередной раз помер, мои надежды не оправдались. Действительно, начала глючить флешка, но я заранее заказал на Aliexpress новый SDD, марки KingDian объёмом 64 Гб.

План был таков - из ноута вытащить старый HDD и поставить его в кубик, а новый SDD поставить в ноут. Был еще вариант купить новую флешку, но посмотрев на цену (хорошая флешка стоила около 1600 рублей, а цена SDD - 2000), этот вариант сразу же отпал. Правда пришлось ещё докупить вот такую коробочку для жёсткого диска, ибо Sata порт кубика port multiplier не поддерживает. Хотя я находил решение, но ссыкотно было его покупать, хрен его знает, может не взлетит.

И выяснил вот ещё что - флешка для Cubietruck хоть как нужна, он с неё начинает загрузку, хотя первый (и второй, вроде) Cubieboard могли это делать напрямую с винта.

Итак, диск приехал, я сразу метнулся на почту, а следом в магазин за внешним боксом. Подключил 2,5" диски к десктопу, разбил новый диск на партиции через Gparted (не Ъ, да), начал копировать систему посредством rsync. Позже напишу пост, чё да как, очень удобная штука, как выяснилось, плюс про полезные фичи для работы системы на SSD диске.

SDD воткнул в ноут, система нормально загрузилась. Далее поставил (в который раз) Cubian на флешку, скопировал всё на диск, после этого внёс изменения в загрузочный файл (об этом тоже в другом посте), чтобы дальнейшая загрузка шла с диска.

Далее разобрал ту конструкцию, на которой крепилась плата Cubietruck, выкинул батарейку - из-за неё кубик при большой нагрузке на диск отключался. Воткнул всё в ч0рную коробочку, которая также шла в комплекте с Cubietruck. Надеюсь, мозгоёбство на этом закончится.