Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
linux_faq:сборка_системы_для_arm-роутера_на_pc [2020/05/31 09:00] – [Проблемы] adminlinux_faq:сборка_системы_для_arm-роутера_на_pc [2020/10/15 19:31] – [Сборка Armbian] admin
Line 1: Line 1:
 +У меня есть такой роутер: [[https://wiki.autosys.tk/home/router?s[]=nano&s[]=pi#nano_pi_r1_1gb|Nano Pi R1 ]] и я бы хотел собрать для него образ [[ https://freedombox.org/ FreedomBox ]]. \\
 +И собирать его я бы хотел на PC. \\
 +Вот тут много информации (хотя и не всегда свежей) о сборке и загрузке debian на платформах Allwinner - https://wiki.debian.org/InstallingDebianOn/Allwinner. \\
 +Тем, кому не хочется ничего собирать - https://www.armbian.com/nanopi-r1/ и если хочется, но не вдаваясь в подробности - https://github.com/armbian/build
 +
 +====== Armbian ======
 +При попытке загрузить образ **Armbian_20.02.1_Nanopi-r1_buster_current_5.4.20.img** система останавливалась при попытке распаковать ядро:
 +<code>Starting kernel ...
 +
 +Uncompressing Linux... done, booting the kernel.
 +</code>
 +В итоге **Armbian** удалось загрузить так:
 +  - Берем официальный образ **nanopi-r1_sd_friendlycore-xenial_4.14_armhf_20191219.img**. На нем три раздела. Подключаем **loop-device** и потом монтируем куда-то: <code> sudo partx -a -v ./nanopi-r1_sd_friendlycore-xenial_4.14_armhf_20191219.img</code>
 +  - Берем образ **armbian** и также подключаем его как **loop-device**. 
 +  - Берем с образа **armbian** из директории **boot** файлики **zImage** и **initrd** (вернее файлики на которые указывают эти симлинки), а также **sun8i-h3-nanopi-r1.dtb** и переносим их на официальный образ в раздел **boot** (заменив старые). Переименовываем **initrd** - на официальном образе он называется **rootfs.cpio.gz**. Остальные **dtb** с официального образа удаляем, во избежание путаницы.
 +  - На официальном образе удаляем всё с раздела **rootfs**.
 +  - Переносим всю файловую систему с единственного раздела образа **armbian** на раздел **rootfs** официального образа: <code>sudo rsync -av ./source ./destination</code>
 +  - Отмонтируем **loop**-устройства и заливаем официальный образ (c ядром, initrd и файловой системой от armbian), на флеху.
 +Для сборки загружающегося образа я сделал скриптец:
 +<code>#!/bin/bash
 +armbian_img='Armbian_20.05.0-trunk_Nanopi-r1_bionic_current_5.4.32.img'
 +friendlyarm_img='nanopi-r1_sd_friendlycore-xenial_4.14_armhf_20191219.img'
 +
 +echo 'Copying Original FriendlyARM image...'
 +cp $friendlyarm_img "Armbian_bootable.img"
 +
 +mkdir ./original_armbian
 +mkdir ./bootable_armbian_boot
 +mkdir ./bootable_armbian_rootfs
 +
 +armbian_offset=`/sbin/fdisk -lu $armbian_img | grep ${armbian_img}1 | awk '{ print $2}'`
 +
 +echo "Armbian partition Offset - " $(( $armbian_offset * 512 ))
 +
 +mount -o loop,offset=$(($armbian_offset * 512)) $armbian_img ./original_armbian
 +
 +friendlyarm_boot_offset=`/sbin/fdisk -lu $friendlyarm_img | grep ${friendlyarm_img}1 | awk '{ print $2}'`
 +friendlyarm_rootfs_offset=`/sbin/fdisk -lu $friendlyarm_img | grep ${friendlyarm_img}2 | awk '{ print $2}'`
 +
 +mount -o loop,offset=$(($friendlyarm_boot_offset * 512)) ./Armbian_bootable.img ./bootable_armbian_boot
 +
 +echo "Copying kernel..."
 +cp -L ./original_armbian/boot/zImage ./bootable_armbian_boot/zImage
 +
 +echo "Copying initrd..."
 +cp -L ./original_armbian/boot/uInitrd ./bootable_armbian_boot/rootfs.cpio.gz
 +
 +echo "Copying DTB"
 +rm -f ./bootable_armbian_boot/sun8i*.dtb
 +cp ./original_armbian/boot/dtb/sun8i-h3-nanopi-r1.dtb ./bootable_armbian_boot/
 +
 +umount ./bootable_armbian_boot
 +
 +mount -o loop,offset=$(($friendlyarm_rootfs_offset * 512)) ./Armbian_bootable.img ./bootable_armbian_rootfs
 +rm -Rf ./bootable_armbian_rootfs/*
 +
 +echo "Copying rootfs"
 +rsync -a ./original_armbian/ ./bootable_armbian_rootfs/
 +rm -rf ./bootable_armbian_rootfs/boot/*
 +
 +umount ./bootable_armbian_rootfs
 +umount ./original_armbian
 +
 +echo 'Done!'</code>
 +
 +==== Проблемы ====
 +В один прекрасный момент интернет, который раздавал этот роутер отвалился. В журнале обнаружилось вот что:
 +<code>[482827.380398] ------------[ cut here ]------------
 +[482827.380448] WARNING: CPU: 0 PID: 0 at net/sched/sch_generic.c:448 dev_watchdog+0x213/0x214
 +[482827.380459] NETDEV WATCHDOG: eth1 (r8152): transmit queue 0 timed out
 +[482827.380466] Modules linked in: nft_masq nft_nat nft_chain_nat nf_nat nft_counter nft_ct nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables_set nf_tables nfnetlink evdev brcmfmac brcmutil cfg80211 lima sun8i_codec_analog snd_soc_simple_card sun4i_gpadc_iio sun8i_adda_pr_regmap sun4i_i2s snd_soc_simple_card_utils gpu_sched rfkill snd_soc_core industrialio snd_pcm_dmaengine sun8i_thermal snd_pcm cdc_ether snd_timer usbnet option snd r8152 soundcore usb_wwan usbserial sunxi_cedrus(C) v4l2_mem2mem uio_pdrv_genirq gpio_keys uio cpufreq_dt zram sch_fq_codel usb_f_acm u_serial g_serial libcomposite ip_tables x_tables pwrseq_simple uas realtek
 +[482827.380668] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G                5.4.32-sunxi #trunk
 +[482827.380674] Hardware name: Allwinner sun8i Family
 +[482827.380717] [<c010da8d>] (unwind_backtrace) from [<c010a0ad>] (show_stack+0x11/0x14)
 +[482827.380745] [<c010a0ad>] (show_stack) from [<c0951e8f>] (dump_stack+0x6f/0x7c)
 +[482827.380775] [<c0951e8f>] (dump_stack) from [<c011b5ff>] (__warn+0xb7/0xb8)
 +[482827.380799] [<c011b5ff>] (__warn) from [<c011b8ab>] (warn_slowpath_fmt+0x5f/0x74)
 +[482827.380822] [<c011b8ab>] (warn_slowpath_fmt) from [<c085019b>] (dev_watchdog+0x213/0x214)
 +[482827.380848] [<c085019b>] (dev_watchdog) from [<c01720c3>] (call_timer_fn+0x27/0x128)
 +[482827.380869] [<c01720c3>] (call_timer_fn) from [<c0172c3d>] (run_timer_softirq+0x3f9/0x418)
 +[482827.380891] [<c0172c3d>] (run_timer_softirq) from [<c01022f7>] (__do_softirq+0xdf/0x288)
 +[482827.380912] [<c01022f7>] (__do_softirq) from [<c0120353>] (irq_exit+0x7b/0x90)
 +[482827.380938] [<c0120353>] (irq_exit) from [<c0160517>] (__handle_domain_irq+0x47/0x84)
 +[482827.380968] [<c0160517>] (__handle_domain_irq) from [<c05e3bed>] (gic_handle_irq+0x39/0x6c)
 +[482827.380992] [<c05e3bed>] (gic_handle_irq) from [<c0101ae5>] (__irq_svc+0x65/0x94)
 +[482827.381002] Exception stack(0xc0f01f20 to 0xc0f01f68)
 +[482827.381022] 1f20: 00000000 54e7da08 ef69ff34 c0116341 ffffe000 c0f04f68 c0f04fb0 00000001
 +[482827.381041] 1f40: c0f04f48 00000000 c0ec48f0 c0ff67f6 ffffffff c0f01f70 c010792f c0107930
 +[482827.381050] 1f60: 40070033 ffffffff
 +[482827.381074] [<c0101ae5>] (__irq_svc) from [<c0107930>] (arch_cpu_idle+0x28/0x2c)
 +[482827.381100] [<c0107930>] (arch_cpu_idle) from [<c013fa47>] (do_idle+0x15b/0x1cc)
 +[482827.381121] [<c013fa47>] (do_idle) from [<c013fcb1>] (cpu_startup_entry+0x19/0x20)
 +[482827.381146] [<c013fcb1>] (cpu_startup_entry) from [<c0e00c6d>] (start_kernel+0x3fb/0x40c)
 +[482827.381158] ---[ end trace df317a78f05c9e9f ]---
 +</code>
 +Ядро: Linux nanopi-r1 5.4.32-sunxi #trunk SMP Sat Apr 25 21:48:40 UTC 2020 armv7l armv7l armv7l GNU/Linux
 +
 +===== Сборка Armbian =====
 +  /home/mike/build/userpatches/config-example.conf
 +  
 +  ./compile.sh  BOARD=nanopi-r1 BRANCH=dev RELEASE=buster BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=yes
 +или так:
 +  ./compile.sh  BOARD=nanopi-r1 BRANCH=current RELEASE=buster BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=no
 +На **NanoPi R1** у меня работает вот так собранный **Armbian**:
 +  sudo ./compile.sh  BOARD=nanopi-r1 BRANCH=current RELEASE=bionic BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=no
 +Если надо собрать образ с какой-то конкрентной версией ядра, то далем так: Add: KERNELBRANCH='tag:v4.14.52' to build/userpatches/lib.config \\
 +Подробнее тут - https://forum.armbian.com/topic/10427-specific-kernel-build/
 +====== Сборка ядра и u-boot для Nano Pi R1 (Allwinner H3)======
 +http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B \\
 +Ставим софт:
 +  apt-get install git swig python-dev python3-dev build-essential bc bison flex u-boot-tools screen gcc-arm-linux-gnueabi libncurses-dev
 +Распаковываем тулчейн (его можно найти [[https://drive.google.com/drive/folders/1pr5qG4GHf20hv4OncTrgULM0H-haJIjW|тут]]):
 +  tar xf arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz -C /opt/FriendlyARM/toolchain/
 +  export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
 +  export GCC_COLORS=auto
 +  . ~/.bashrc
 +  arm-linux-gcc -v
 +  
 +===== Собираем U-Boot =====
 +  cd ~
 +  git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1
 +  cd u-boot/
 +  make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
 +  make ARCH=arm CROSS_COMPILE=arm-linux-
 +в результате получится файлик **u-boot-sunxi-with-spl.bin**, который можно записать на SD-карточку:
 +  dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
 +
 +==== Собираем ядро ====
 +Вариантов пара - собрать то что предлагает **FriendlyARM**, либо **mainline kernel**. \\
 +В конце концов, я пришел к тому, что собрать придется оба ядра! \\
 +Mainline - новое и хорошее, при его работе (в по крайней мере под qemu) не возникает некоторых ошибок типа:
 +  thermal thermal_zone0: failed to read out thermal zone (-16)
 +Зато с ядром от **FriendlyARM** собираются родные для этих устройств файлы **DTB**.
 +=== Ядро от FriendlyARM - 4.14 ===
 +  cd ~
 +  git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
 +  cd linux
 +  touch .scmversion
 +  make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
 +  make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
 +Теперь образы ядра и файлики dtb можно скопировать на загрузочный разле флехи:
 +  cp arch/arm/boot/zImage /media/SD/boot/
 +  cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb /media/SD/boot/
 +Теперь соберем модули:
 +  cd ~/linux
 +  make modules ARCH=arm CROSS_COMPILE=arm-linux-
 +и скопируем их на флеху. Считаем, что корневой раздел системы смонтирован в /media/SD/rootfs/:
 +  cd ~/linux
 +  make modules_install INSTALL_MOD_PATH=/media/SD/rootfs/ ARCH=arm CROSS_COMPILE=arm-linux-
 +
 +=== Ядро Mainline ===
 +<code>git clone https://github.com/torvalds/linux.git -b master --depth 1 mainline_linux
 +cd mainline_linux
 +</code>
 +Вот [[https://www.qemu.org/docs/master/system/arm/orangepi.html#running-mainline-linux|тут написано]], что под **orangepi** ядро надо собирать с помощью **arm-linux-gnueabi-**, однако у **FriendlyARM** написано, что с помощью **arm-linux-** из их тулчейна. Я буду собирать с  **arm-linux-**. Хотя, в чем именно разница - я не знаю, по крайней мере пока. \\
 +Для начала - скопируем файлик **sunxi_defconfig**, который идет с ядром от **FriendlyARM**, в **mainline**:
 +  cp ./linux/arch/arm/configs/sunxi_defconfig ./mainline_linux/arch/arm/configs/sunxi_defconfig
 +Также, в **mainline** может не быть исходников некоторых модулей. Скопируем их:
 +  cp ./linux/drivers/net/ethernet/allwinner/* ./mainline_linux/drivers/net/ethernet/allwinner/
 +  
 +<code>export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
 +export GCC_COLORS=auto
 +ARCH=arm CROSS_COMPILE=arm-linux- make mrproper
 +make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
 +make ARCH=arm CROSS_COMPILE=arm-linux-</code>
 +И соберем модули:
 +  make modules ARCH=arm CROSS_COMPILE=arm-linux-
 +
 +====== Запуск в эмуляторе ======
 +Вот тут страничка **qemu-system-arm**, посвященная эмуляции **OrangePi** (который тоже на **Allwinner H3**): https://www.qemu.org/docs/master/system/arm/orangepi.html \\
 +Судя по [[https://lore.kernel.org/qemu-devel/6d774864-2bea-ecd6-0b14-a28d0756bfbc@adacore.com/|обсуждениям патчей]] поддержка эмуляции машин на **Allwinner H3** появилась совсем недавно - в конце 2019 года. \\
 +Вот тут описан запуск собранного u-boot и ядра: \\
 +https://dev.to/rulyrudel/how-to-execute-u-boot-on-qemu-system-arm-2b22 \\
 +https://pandysong.github.io/blog/post/run_u-boot_in_qemu/ \\
 +===== Собираем последний qemu =====
 +https://www.qemu.org/download/#source \\
 +<code>cd ~
 +apt-get install git build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv
 +git clone https://git.qemu.org/git/qemu.git
 +cd qemu
 +git submodule init
 +git submodule update --recursive
 +./configure
 +make
 +</code>
 +Теперь можно посмотреть список машин, который поддерживается и попробывать запустить собранное ядро или u-boot:
 +<code>
 +cd ~
 +./qemu/arm-softmmu/qemu-system-arm -machine help | grep orangepi
 +...
 +./qemu/arm-softmmu/qemu-system-arm -M orangepi-pc -nic user -nographic \
 +    kernel ./linux/arch/arm/boot/zImage \
 +    -append 'console=ttyS0,115200' \
 +    -dtb ./linux/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dtb
 +</code>
 +Так как никакой корневой файловой системы у нас нет, то всё закончится так:<code>.....
 +[    4.075519] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
 +</code>
 +Но ядро запустилось!
 +
 +====== Сборка образа минимальной системы debian ======
 +https://wiki.debian.org/EmDebian/CrossDebootstrap#Cross-installing_Debian_using_debootstrap.2Fmultistrap \\
 +\\
 +https://wiki.debian.org/Multistrap \\
 +https://manpages.debian.org/jessie/multistrap/multistrap.1 \\
 +https://gitlab.mister-muffin.de/josch/multistrap/commit/b54b65b9f73bdb97d9c2486f0eb021b2b1a2d30e  \\
 +  sudo apt-get install multistrap kpartx qemu qemu-user-static binfmt-support dpkg-cross 
 +
 +===== Создаем образ флехи =====
 +<code> cd ~
 +fallocate -l 4G debian-stable.img
 +disk='debian-stable.img'
 +sgdisk --zap-all $disk
 +sgdisk --mbrtogpt --clear $disk
 +sgdisk --new=1:2048:+64Mib $disk
 +sgdisk --typecode=1:8300 $disk
 +sgdisk -N0 $disk
 +sgdisk --typecode=2:8300 $disk</code>
 +Создадим loop-устройства и обнаружим на них партиции:
 +  sudo kpartx -v -a ./debian-stable.img
 +В выводе будет что-то такое:
 +  add map loop4p1 (253:2): 0 524289 linear 7:4 2048
 +  add map loop4p2 (253:3): 0 7860191 linear 7:4 528384
 +Отформатируем эти партиции, создадим точки монтирования и смонтируем их! \\ 
 +  sudo mkfs.ext4 /dev/mapper/loop4p2
 +  sudo mkfs.ext2 /dev/mapper/loop4p1
 +  mkdir debian-stable
 +  sudo mount  /dev/mapper/loop4p2 ./debian-stable
 +  sudo mkdir ./debian-stable/boot
 +  sudo mount  /dev/mapper/loop4p1 ./debian-stable/boot
 +
 +
 +===== Заливка минимальной системы debian =====
 +Для создания системы я применю [[https://wiki.debian.org/Multistrap|Multistrap]].
 +==== ./debian-stable.conf ====
 +Минимальный конфигурационный файлик **Multistrap**
 +<code>[General]
 +unpack=true
 +bootstrap=Debian
 +aptsources=Debian
 +#cleanup=true
 +
 +[Debian]
 +packages=systemd libnss-systemd libpam-systemd dbus default-dbus-session-bus
 +source=http://ftp.ru.debian.org/debian
 +keyring=debian-archive-keyring
 +suite=stable</code>
 +
 +==== Заливаем систему ====
 +Теперь на смонтированные разделы нашего файла-образа я залью минимальную систему **debian**.
 +  sudo multistrap -a armhf -d ./debian-stable -f ./debian-stable.conf
 +При попытке собрать файловую систему появляется ошибка:
 +  E: The repository 'http://ftp.ru.debian.org/debian buster InRelease' is not signed.  
 +Причина в том, что в скрипте **multistrap** некорректно устанавливается значение опции **AllowUnauthenticated**. Описано тут: https://github.com/volumio/Build/issues/348#issuecomment-462271607 \\
 +Патчим **multistrap**:
 +  sudo sed -i 's/Apt::Get::AllowUnauthenticated=true/Acquire::AllowInsecureRepositories=true/g'  /usr/sbin/multistrap
 +и пробуем снова (в конфигурации должна быть опция **keyring=debian-archive-keyring**, а **noauth=true** быть не должно!):
 +  sudo multistrap -a armhf -d ./debian-stable -f ./debian-stable.conf
 +В результате всё получается и в директории **./debian-stable** (куда смонтирован второй раздел файлика-образа) мы наблюдаем корневую файловую систему текущей стабильной версии **Debian** для архитектуры **armhf**. \\
 +
 +==== Первичная конфигурация пакетов ====
 +Запускать в **chroot** исполняемые файлы для архитектуры **arm** нам позволят ранее установленные в хостовой системе пакеты **qemu-user-static**, **binfmt-support** и **dpkg-cross**. \\
 +Подключим **/dev** (что необходимо для работы с **/dev/null** и **/dev/urandom**) и настроим пакеты:
 +  sudo mount -o bind /dev/ ./debian-stable/dev/
 +  sudo LC_ALL=C LANGUAGE=C LANG=C DEBIAN_FRONTEND=noninteractive chroot debian-stable bash -c 'echo "dash dash/sh boolean false" | debconf-set-selections &&  dpkg --configure -a'
 +Для настройки некоторых пакетов нужно задать пароль **root**:
 +  sudo chroot debian-stable/ passwd
 +Теперь донастроим оставшиеся пакеты:
 +  sudo LC_ALL=C LANGUAGE=C LANG=C DEBIAN_FRONTEND=noninteractive chroot debian-stable dpkg --configure -a
 +
 +Теперь скопируем ядро и **dtb**:
 +  sudo cp ./mainline_linux/arch/arm/boot/zImage ./debian-stable/boot/
 +  sudo cp ./mainline_linux/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dt* ./debian-stable/boot/
 +Дальше нужно перенести в систему модули ядра, которые мы собрали раньше:
 +  cd ./mainline_linux
 +  sudo PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH make modules_install INSTALL_MOD_PATH=../debian-stable ARCH=arm CROSS_COMPILE=arm-linux-
 +Теперь можно сделать файлик **/etc/fstab**. Для этого - посмотрим UUID партиций и создадим **/etc/fstab**:
 +  blkid /dev/mapper/loop4p1
 +  /dev/mapper/loop4p1: UUID="85b026f4-afd7-4ecf-8679-dd0c87e628bb" TYPE="ext2" PARTUUID="f9c59bb5-1bde-441b-8e5a-9eeff8e77693"
 +  blkid /dev/mapper/loop4p2
 +  /dev/mapper/loop4p2: UUID="683177df-8d27-4733-a490-c8e69fb0b525" TYPE="ext4" PARTUUID="9faf1102-5994-4226-ac73-adc6b6e4e043"
 +В итоге **/etc/fstab** будет такой:
 +  UUID=683177df-8d27-4733-a490-c8e69fb0b525   /      ext4   defaults,discard,noatime,nodiratime     1
 +  UUID=85b026f4-afd7-4ecf-8679-dd0c87e628     /boot  ext2   defaults,discard,noatime,nodiratime     1
 +Заменим дефолтный target: 
 +  sudo rm -f ./debian-stable/etc/systemd/system/default.target
 +  sudo ln -s /lib/systemd/system/multi-user.target ./debian-stable/etc/systemd/system/default.target
 +И создадим симлинк для того, чтобы появилось устройство **ttyS0**:
 +  sudo ln -s /lib/systemd/system/getty@.service ./debian-stable/etc/systemd/system/getty.target.wants/getty@ttyS0.service
 +Если этого не сделать - будут ошибки типа:
 +  [  *** ] A start job is running for /dev/ttyS0 (1min 29s / 1min 30s)
 +  [ TIME ] Timed out waiting for device /dev/ttyS0.
 +  [DEPEND] Dependency failed for Serial Getty on ttyS0.
 +==== Отмонтируем файл-образ и попробуем запуститься ====
 +  cd ~
 +  sudo umount ./debian-stable/boot
 +  sudo umount ./debian-stable
 +Удалим loop-устройства:
 +  sudo kpartx -d ./debian-stable.img
 +И попробуем запуститься с ядром **mainline** и **dtb** из поставки ядра от **FriendlyARM**!
 +<code>./qemu/arm-softmmu/qemu-system-arm -M orangepi-pc \
 +-nic user -nographic -kernel ./mainline_linux/arch/arm/boot/zImage  \
 +-append 'console=ttyS0,115200 root=/dev/mmcblk0p2' \
 +-dtb ./linux/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dtb \
 +-sd ./debian-stable.img</code>
 +В итоге - не смотря на некоторые ошибки с сервисами **systemd**, система смогла загрузиться, а я смог в нее залогиниться с паролем, заданным на этапе создания образа.
 +
 +
 +===== Загрузка системы на реальной железке =====
 +Самым логичным способом, чтобы настройки загрузки на флехе соотвествовали настройкам U-Boot в железке, было бы взять образ флехи от производителя (например с ubuntu xenial), подмонтировать его и заменить файлик ядра и корневую файловую систему.\\
 +Я так и поступил. \\
 +\\
 +Но можно пойти трудным путем и пытаться сделать все вручную.
 +==== Исследование конфигурации U-Boot ====
 +Судя по начальным сообщениям:
 +<code>DRAM: 1024 MiB(408MHz)
 +CPU Freq: 408MHz
 +memory test: 1
 +Pattern 55aa  Writing...Reading...OK
 +Trying to boot from MMC2
 +Boot device: emmc
 +
 +
 +U-Boot 2017.11 (Oct 18 2019 - 02:50:31 +0800) Allwinner Technology
 +
 +CPU:   Allwinner H3 (SUN8I 1680)
 +Model: FriendlyElec NanoPi H3
 +DRAM:  1 GiB
 +CPU Freq: 1008MHz
 +MMC:   SUNXI SD/MMC: 1, SUNXI SD/MMC: 0
 +*** Warning - bad CRC, using default environment</code>
 +И судя по тому, что начинает загружаться предустановленная система - я что-то сделал не так. \\
 +Наверное надо взять официальный образ и посмотреть что внутри. \\
 +Кстати, в выводе **printenv** некоторые особенности. \\
 +<code>arch=arm
 +baudrate=115200
 +board=nanopi-r1
 +board_name=sunxi
 +boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
 +boot_efi_binary=if fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr ${fdtcontroladdr};fi;load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/booti
 +boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}extlinux/extlinux.conf
 +boot_mmc=2
 +boot_net_usb_start=usb start
 +boot_prefixes=/ /boot/
 +boot_script_dhcp=boot.scr.uimg
 +boot_scripts=boot.scr.uimg boot.scr
 +boot_targets=fel mmc_auto usb0 pxe dhcp 
 +bootcmd=fatload mmc 0:1 ${scriptaddr} boot.scr; source ${scriptaddr}
 +bootcmd_dhcp=run boot_net_usb_start; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then sete;
 +bootcmd_fel=if test -n ${fel_booted} && test -n ${fel_scriptaddr}; then echo '(FEL boot)'; source ${fel_scriptaddr}; fi
 +bootcmd_mmc0=setenv devnum 0; run mmc_boot
 +bootcmd_mmc1=setenv devnum 1; run mmc_boot
 +bootcmd_mmc_auto=run bootcmd_mmc0
 +bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi
 +bootcmd_usb0=setenv devnum 0; run usb_boot
 +bootdelay=2
 +bootm_size=0xa000000
 +console=ttyS0,115200
 +cpu=h3
 +dfu_alt_info_ram=kernel ram 0x42000000 0x1000000;fdt ram 0x43000000 0x100000;ramdisk ram 0x43300000 0x4000000
 +distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
 +efi_dtb_prefixes=/ /dtb/ /dtb/current/
 +ethaddr=02:81:8a:99:42:c5
 +fdt_addr_r=0x43000000
 +fdtcontroladdr=7bf4fa48
 +fdtfile=sun8i-h3-nanopi-m1-plus.dtb
 +kernel_addr_r=0x42000000
 +load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
 +mmc_boot=if mmc dev ${devnum}; then setenv devtype mmc; run scan_dev_for_boot_part; fi
 +mmc_bootdev=1
 +preboot=usb start
 +pxefile_addr_r=0x43200000
 +ramdisk_addr_r=0x43300000
 +scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
 +scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${die
 +scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if te
 +scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}extlinux/extlinux.conf; then echo Found ${prefix}extlinux/extlinux.conf; run boot_extlinux; echo SCRIPT FAILi
 +scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_scre
 +scriptaddr=0x43100000
 +serial#=02c000818a9942c5
 +soc=sunxi
 +stderr=serial
 +stdin=serial,usbkbd
 +stdout=serial
 +usb_boot=usb start; if usb dev ${devnum}; then setenv devtype usb; run scan_dev_for_boot_part; fi
 +wifi_mac_node=[2 c5 42 99 8a 81]</code>
 +
 +Во-первых - **DTB** не от **nanopi-r1**, а **sun8i-h3-nanopi-m1-plus.dtb**
 +
 +
 +
  
  • linux_faq/сборка_системы_для_arm-роутера_на_pc.txt
  • Last modified: 2020/11/17 18:28
  • by admin