В данной заметке рассказано как запустить ванильный Debian Linux на телефоне не прошивая его и не портя установленный Android.
Мой подопытный аппарат Xiaomi Redmi note 11. Телефон не нужно рутовать, достаточно разблокировать загрузчик. Запускать будем с помощью fastboot (да для каждого запуска потребуется подключать телефон к компьютеру), а рутовую файловую систему будем подцеплять с SD-карты.++ Настройка среды
Создадим рабочий каталог:
mkdir ~/redmi11
cd ~/redmi11/
Скачаем нужное ПО:
sudo apt install qemu-user-static
sudo apt build-dep linux-source
git clone https://android.googlesource.com/platform/system/tools/mkboo...
git clone https://android.googlesource.com/platform/prebuilts/gcc/linu...
cd aarch64-linux-android-4.9
git switch android-msm-barbet-4.19-android12-qpr1
cd ~/redmi11/, так же https://developer.android.com/tools/releases/platform-tools в каталог ./platform-tools.
Пропишем для удобства работы пути в ./path.sh:
export PATH=$PATH:$(pwd)/mkbootimg:$(pwd)/platform-tools
Подключим пути в текущий bash:
. path.sh
++ ЯдроВ ядре, которое идёт в составе Android, выключены некоторые важные подсистемы, поэтому загрузиться с ним по-простому не получится и надо компилировать свою версию.
Надо найти исходники ядра для своего телефона, для Xiaomi с этим почти нет проблем.
git clone https://github.com/MiCode/Xiaomi_Kernel_OpenSource.git
cd Xiaomi_Kernel_OpenSource/
git switch spes-r-ossДля моей версии отсутствовал каталог techpack, он должен был быть, и ядро не собиралось до конца. Я нашёл techpack в аналогичной версии исходников на GitHub. Надо сказать, что исходники ядра Xiaomi имеют много мелких ошибок, связанных с включением "" <> хидеров и прочего. Я их все муторно правил, пока не добился компиляции без ошибок.
Получим конфиг ядра с телефона, для этого подключим его к компьютеру и выполним:adb shell zcat /proc/config.gz > .config
Сделаем два скрипта - для конфигурации ядра и для компиляции.
./menuconfig.sh:
PATH="$PATH:$HOME/redmi11/aarch64-linux-android-4.9/bin"
ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- make menuconfig./build.sh:
PATH="$PATH:$HOME/redmi11/aarch64-linux-android-4.9/bin"
ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- make -j 8 targz-pkgТеперь изменим кофигурацию ядра и скомпилируем его. Во-первых в нем отключена поддержка devtmpfs, включим её
CONFIG_DEVTMPFS=y
Включим виртуальные консоли:
CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=yФрэймбуфер:
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_FRAMEBUFFER_CONSOLE=yЧтобы консоль не заваливало сообщениями ядра:
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=4
CONFIG_CONSOLE_LOGLEVEL_QUIET=3
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=3
++ ROOT файловая система
Используем debootstrap для получения файловой системы:cd ~/redmi11/
mkdir rootfs
sudo debootstrap --arch=arm64 stable ./rootfs http://mirror.yandex.ru/debian
sudo chroot rootfs/ tasksel install gnome-desktopСкопируем полученное ядро в ./rootfs/boot и модули если есть в ./rootfs/lib/modules.
Отредактируем ./rootfs/etc/fstab:
LABEL=debian / ext4 rw,defaults,noatime,nodiratime 0 1
tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,mode=1777Создадим initrd:
sudo chroot rootfs/ apt install initramfs-tools
sudo mount --bind /dev rootfs/dev
sudo chroot rootfs/ update-initramfs -k all -c
sudo umount rootfs/devТеперь для удобства сделаем образ нашей файловой системы, для этого используем скрипт install.sh:
#!/bin/sh
mkdir -p mnt
dd if=/dev/zero of=debian-arm64.ext4 bs=4096 count=2097152 #8Gb
/sbin/mkfs.ext4 -L debian -O^has_journal debian-arm64.ext4
sudo mount -o loop debian-arm64.ext4 ./mnt
sudo cp -ar ./rootfs/* ./mnt/
sudo umount ./mntНа SD карточке у меня два раздела - первый FAT32, и второй под Linux. Запишем образ на SD карточку:
sudo dd if=debian-arm64.ext4 of=/dev/YourSD2 bs=512 status=progress
sudo partprobe
sudo resize2fs /dev/YourSD2
++ ЗапускДля запуска нам нужно подготовить Android boot image, используем скрипт mkbootimg.sh:
mkbootimg.py \
--header_version 3 \
--os_version 12.0.0 \
--os_patch_level 2023-04 \
--kernel ./rootfs/boot/vmlinuz-4.19.157-tiny \
--ramdisk ./rootfs/boot/initrd.img-4.19.157-tiny \
--cmdline 'console=tty0 quiet root=LABEL=debian rootwait' \
--board '' \
-o boot-debian.img
Здесь мы запускаем ядро с rootfs с меткой "debian", как мы и делали образ файловой системы.Теперь собственно запуск. Подключим телефон к компьютеру и выполним (не бойтесь ничего не записывается на него):
adb reboot bootloader
fastboot boot boot-debian.img
P.S. А с драйверами я не разобрался.
URL:
Обсуждается: http://www.opennet.dev/tips/info/3226.shtml
1) Разблокировка бутлоадера доступна не для всех телефонов. Мягко говоря.
2) Вместо кача mkbootimage хзоткуда можно просто установить пакет "abootimg". Мелкий, никаких питонов и клонов хзоткуда не надо, есть в дебианах и убунтах. Можно и чужой bootimg распаковать и свой сделать.
3) Ребилд вендорского ядра это хардкор во все поля...
А как без ребилда ядра? Андроидовское не катит - нет devtmpfs и vts. И Xы и Wayland требуют виртуальную консоль, так фиг запустишь.
Какой-то бессмысленный ад.Потратить тучу времени, чтобы загрузиться в то, что практически не работает: "драйверами я не разобрался"?
Зачем?
> Зачем?
Просто все думают, что надо что то прошивать для "Linux на телефоне", а можно ничего не портить.
К вопросу "зачем"
На этом этапе экспериментов usb-сетевухи и сенсорный экран уже работают или ещё нет?
Собрать сетевой анализатор для проверки dhcp, доступности адресов и т.п. можно?
> К вопросу "зачем"
> На этом этапе экспериментов usb-сетевухи и сенсорный экран уже работают или ещё
> нет?
> Собрать сетевой анализатор для проверки dhcp, доступности адресов и т.п. можно?Это работает, USB сетевухи заработают, USB gadget ETH работает.
> Какой-то бессмысленный ад.
> Потратить тучу времени, чтобы загрузиться в то, что практически не работает: "драйверами я не разобрался"?
> Зачем?Посмотри как живёт наука, медицина, исследования.
Каждая статья о чём-то небольшом. Каждый отдельно делает небольшую работу. Со временем несколько разных статей позволяют сделать какую-то большую вещь.
P.S. А Андроид, увы, убил идею КПК - карманного персонального компьютера. Из-за чего такие статьи очень ценны, и без драйверов тоже.
Самый гланый вопрос, ВОПРОСИЩЕ: звонить и СМС из Debian возможно?
Возможно, при наличии драйверов.
Т.е. нет.
Невозможно. Драйверов не завязанных на андроидный юзерспейс для этого нет и не будет.
зачем вам звонить с линукса ?
гораздо полезней вайфай поднять или просто возможность использовать как мини-компьютер для игр там или для коддинга в отрыве от интернета
> P.S. А с драйверами я не разобрался.А почему не использовать штатное ядро со штатными драйверами?
И, мне кажется, это лучше оформить ввиде docker или flatpak
>> P.S. А с драйверами я не разобрался.
> А почему не использовать штатное ядро со штатными драйверами?Ты имеешь ввиду мэинлайн ядро? На моем xiaomi не прокатывает - черный экран.
штатное ядро из штатной прошивки
Не получится с ним, и постмаркет перекомпилирует с другими параметрами...
Поясните пожалуста манипуляцию с разделом СД карты, вы его просто перезаписали ?
> ./rootfs http://mirror.yandex.ru/debianхорошая попытка, ФСБ, но - нет.
Спасибо, чувак. Ищу такие решения.
Wifi работает ?? Если да , то смартфон можно хоть как домашний сервер гонять хотя бы .Если нет ....
Извечная проблема с драйверами в Linux.
К сожалению не сработало. Устройство не грузится, чёрный экран. Пробовал:
1) в fstab и cmdline менять на другой путь к сд.
2) собирать initramfs на целевом устройстве (так как с пк лог был таким:
update-initramfs -c -k all
update-initramfs: Generating /boot/initrd.img-5.4.242-9b433a4c
W: zstd compression (CONFIG_RD_ZSTD) not supported by kernel, using gzip
W: Possible missing firmware /lib/firmware/b43/ucode11.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode13.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode14.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode15.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode16_lp.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode16_mimo.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode24_lcn.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode25_lcn.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode25_mimo.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode26_mimo.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode29_mimo.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode33_lcn40.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode30_mimo.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode5.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode40.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode42.fw for built-in driver b43
W: Possible missing firmware /lib/firmware/b43/ucode9.fw for built-in driver b43
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault (core dumped)
).
3) кучу разных конфигураций ядра. Сами исходники нормальные и под моё устройство (собрал из них NethHunter ядро и пользуюсь)Пробовал на Xiaomi 11 Lite 5G NE (Lisa) прошитом на PixelOS 14 QPR2
PS: у меня есть несколько предположений на счёт того почему у меня не получилось:
1)Я просто не дождался загрузки (хотя ждал по 10-15 мин).
2)second bootloader просто не понял что ему грузить, так как адреса kernel и ramdisk отличаются от стоковых.
3) картинка выводилась не в tty0
4) Не подходящая версия mkbootimg
5) фазы луны не совпали (самое вероятное)