The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Запуск Linux на Android-телефоне с SD-карты без перепрошивки
В данной заметке рассказано как запустить ванильный 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/mkbootimg
   git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
   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. А с драйверами я не разобрался.
 
09.08.2023 , Автор: Павел Отредиез
Ключи: android, phone, boot, linux, debian, xiaomi / Лицензия: CC-BY
Раздел:    Корень / Пользователю / Мобильные телефоны

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Аноним (-), 13:22, 10/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    1) Разблокировка бутлоадера доступна не для всех телефонов. Мягко говоря.
    2) Вместо кача mkbootimage хзоткуда можно просто установить пакет "abootimg". Мелкий, никаких питонов и клонов хзоткуда не надо, есть в дебианах и убунтах. Можно и чужой bootimg распаковать и свой сделать.
    3) Ребилд вендорского ядра это хардкор во все поля...
     
     
  • 2.8, Павел Отредиез (ok), 15:50, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А как без ребилда ядра? Андроидовское не катит - нет devtmpfs и vts. И Xы и Wayland требуют виртуальную консоль, так фиг запустишь.
     

  • 1.2, Аноним (2), 14:04, 10/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    Какой-то бессмысленный ад.

    Потратить тучу времени, чтобы загрузиться в то, что практически не работает: "драйверами я не разобрался"?

    Зачем?

     
     
  • 2.9, Павел Отредиез (ok), 15:55, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/

    > Зачем?

    Просто все думают, что надо что то прошивать для "Linux на телефоне", а можно ничего не портить.

     
     
  • 3.10, Мимокрокодил (?), 16:59, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    К вопросу "зачем"
    На этом этапе экспериментов usb-сетевухи и сенсорный экран уже работают или ещё нет?
    Собрать сетевой анализатор для проверки dhcp, доступности адресов и т.п. можно?
     
     
  • 4.11, Павел Отредиез (ok), 19:23, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > К вопросу "зачем"
    > На этом этапе экспериментов usb-сетевухи и сенсорный экран уже работают или ещё
    > нет?
    > Собрать сетевой анализатор для проверки dhcp, доступности адресов и т.п. можно?

    Это работает, USB сетевухи заработают, USB gadget ETH работает.

     
  • 2.17, Аноним (17), 01:46, 20/08/2023 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > Какой-то бессмысленный ад.
    > Потратить тучу времени, чтобы загрузиться в то, что практически не работает: "драйверами я не разобрался"?
    > Зачем?

    Посмотри как живёт наука, медицина, исследования.

    Каждая статья о чём-то небольшом. Каждый отдельно делает небольшую работу. Со временем несколько разных статей позволяют сделать какую-то большую вещь.

    P.S. А Андроид, увы, убил идею КПК - карманного персонального компьютера. Из-за чего такие статьи очень ценны, и без драйверов тоже.

     

  • 1.3, Аноним (3), 17:30, 10/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Самый гланый вопрос, ВОПРОСИЩЕ: звонить и СМС из Debian возможно?
     
     
  • 2.6, Павел Отредиез (ok), 15:37, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Возможно, при наличии драйверов.
     
     
  • 3.16, anonymous (??), 16:21, 19/08/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Т.е. нет.
    Невозможно. Драйверов не завязанных на андроидный юзерспейс для этого нет и не будет.
     
     
  • 4.24, Аноним (24), 18:38, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    зачем вам звонить с линукса ?
    гораздо полезней вайфай поднять или просто возможность использовать как мини-компьютер для игр там или для коддинга в отрыве от интернета
     

  • 1.4, 34 (?), 00:57, 11/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > P.S. А с драйверами я не разобрался.

    А почему не использовать штатное ядро со штатными драйверами?

    И, мне кажется, это лучше оформить ввиде docker или flatpak

     
     
  • 2.7, Павел Отредиез (ok), 15:40, 11/08/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >> P.S. А с драйверами я не разобрался.
    > А почему не использовать штатное ядро со штатными драйверами?

    Ты имеешь ввиду мэинлайн ядро? На моем xiaomi не прокатывает -  черный экран.


     
     
  • 3.13, 34 (?), 10:15, 12/08/2023 [^] [^^] [^^^] [ответить]  
  • +/
    штатное ядро из штатной прошивки
     
     
  • 4.14, Павел Отредиез (ok), 23:26, 12/08/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не получится с ним, и постмаркет перекомпилирует с другими параметрами...
     

  • 1.5, Андроид (?), 12:02, 11/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Поясните пожалуста манипуляцию с разделом СД карты, вы его просто перезаписали ?
     
  • 1.12, Аноним (-), 05:13, 12/08/2023 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +1 +/
     
  • 1.15, анон (?), 19:46, 18/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Спасибо, чувак. Ищу такие решения.
     
  • 1.18, Gefest (?), 21:46, 23/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Wifi работает ?? Если да , то смартфон можно хоть как домашний сервер гонять хотя бы  .Если нет  ....
     
  • 1.20, Пряник (?), 09:42, 29/08/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Извечная проблема с драйверами в Linux.
     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру