В данной заметке рассказано как запустить ванильный 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