Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |
bpi-r2:storage [2019/07/30 18:51] – [komplett] frank | bpi-r2:storage [2023/06/08 17:06] (aktuell) – Externe Bearbeitung 127.0.0.1 |
---|
| ====== Speicher ====== |
| {{:bpi-r2:boot-structure.png|}} |
| |
| Quelle: http://forum.banana-pi.org/t/how-to-update-uboot-without-bpi-update/4023/2 |
| |
| es sieht so aus, als wenn /dev/mmcblk1, /dev/mmcblk1boot0 und /dev/mmcblk1boot1 unabhängige Geräte sind (bootx nicht Partitionen in /dev/mmcblk1) |
| |
| ===== preloader ===== |
| |
| {{ :bpi-r2:bpi-r2-preloader-ddr1600-20190722-2k.img.gz |for SD}} muss am 2k-offset (0x800) geschrieben werden |
| |
| sudo dd if=BPI-R2-EMMC-boot0-DDR1600-20190722-2k.img of=/dev/sdc bs=1k seek=2 |
| |
| (SD-Card benötigt zusätzlich MMC_BOOT & BRLYT header, siehe weiter unten) |
| |
| {{ :bpi-r2:bpi-r2-emmc-boot0-ddr1600-20190722-0k.img.gz |for EMMC}} muss am 0-offset (0x0) der boot0-Partition geschrieben werden |
| |
| sudo dd if=BPI-R2-EMMC-boot0-DDR1600-20190722-0k.img of=/dev/mmcblk1boot0 |
| |
| Dateien von hier: https://github.com/BPI-SINOVOIP/BPI-files/tree/master/SD/100MB |
| ===== SD ===== |
| sdcard-bootsektor reverse-engineering |
| [[http://forum.banana-pi.org/t/boot-fails-with-self-build-u-boot/5460/20]] |
| |
| [[http://forum.banana-pi.org/t/how-to-build-an-ubuntu-debian-sd-image-from-scratch/6805/8]] |
| |
| [[https://github.com/BPI-SINOVOIP/BPI-R2-bsp/tree/master/mt-pack/mtk/bpi-r2/bin|SD-Headers]] {{ :bpi-r2:bpi-r2-head440-0k.img |}} {{ :bpi-r2:bpi-r2-head1-512b.img |}} |
| |
| * SDMMC_BOOT-Signatur + Adresse des 2. Headers (0x00000200) - erste 440 byte (vor Partitionstabelle): |
| |
| gunzip -c BPI-R2-HEAD440-0k.img.gz | dd of=/dev/loop8 bs=1024 seek=0 |
| |
| * BRLYT-Signatur + Preloader-Adresse (0x00000800): |
| |
| gunzip -c BPI-R2-HEAD1-512b.img.gz | dd of=/dev/loop8 bs=512 seek=1 |
| |
| |
| ==== komplett ==== |
| |
| dd if=/dev/zero of=../bpi-r2-buster.img bs=1M count=7168 |
| loopdev=$(losetup -f) |
| sudo losetup ${loopdev} ../bpi-r2-buster.img |
| echo $loopdev |
| sudo dd if=~/Downloads/BPI-R2-preloader-DDR1600-20190722-2k.img of=${loopdev} bs=1k seek=2 |
| sudo dd if=~/Downloads/BPI-R2-HEAD440-0k.img of=${loopdev} bs=1024 seek=0 |
| sudo dd if=~/Downloads/BPI-R2-HEAD1-512b.img bs=512 seek=1 |
| sudo dd if=/path/to/u-boot/u-boot.bin of=${loopdev} bs=1k seek=320 |
| sudo sfdisk ${loopdev} < ~/Downloads/parttable.dat |
| sudo partprobe ${loopdev} |
| ls ${loopdev}* |
| sudo mkfs -t vfat ${loopdev}p1 |
| sudo mkfs -t ext4 ${loopdev}p2 |
| sudo fatlabel ${loopdev}p1 BPI-BOOT |
| sudo e2label ${loopdev}p2 BPI-ROOT |
| |
| install debian (from [[debian#debootstrap|bootstrapped rootfs]]) |
| |
| sudo mount ${loopdev}p2 /mnt/ |
| sudo cp -r debian_buster_armhf/. /mnt/ |
| #install kernel-modules to same partition |
| kernelpack=/path/to/bpi-r2_<version>_main.tar.gz |
| sudo tar -xzf ${kernelpack} -C /mnt/ --strip-components=1 BPI-ROOT |
| #install kernel to boot-partition |
| sudo umount /mnt |
| sudo mount ${loopdev}p1 /mnt/ |
| sudo tar -xzf ${kernelpack} -C /mnt/ --strip-components=1 BPI-BOOT |
| #maybe create a uEnv.txt |
| sudo umount /mnt |
| |
| sudo losetup -d ${loopdev} |
| #now write the image to card (make sure /dev/sdc is your sdcard-device and no partition is mounted) |
| sudo dd if=../bpi-r2-buster.img of=/dev/sdc |
| sync |
| ===== MMC-Utils ===== |
| |
| über die [[https://www.kernel.org/doc/Documentation/mmc/mmc-tools.txt|mmc-utils]] kann man aus einem laufenden System testen, ob die EMMC-Partitionierung stimmt (sollte 0x48 sein siehe [[uboot#partition-konfiguration_des_emmc_aendern]]). |
| |
| <code>./mmc extcsd read /dev/mmcblk1 |
| .... |
| Boot configuration bytes [PARTITION_CONFIG: 0x48] |
| ....</code> |
| |
| ich habe die mmc-utils auch in [[https://github.com/frank-w/BPI-R2-4.14/commit/b01360c4e063693c8df750561761edebe9bf5db8|mein Kernel-Repo übernommen]] (mit angepasstem Makefile für Cross-Compile) |
| |
| laut einem Forum-Nutzer (siehe [[http://forum.banana-pi.org/t/bpi-r2-new-image-ubuntu-16-04-v1-2-1-bt-and-wifi-ap-mode-are-working-fine-2017-11-27/4291/60|hier]]) lässt sich die partition config mit den mmc-utils auch schreiben |
| |
| ./mmc bootpart enable 1 1 /dev/mmcblk1 |
| |
| <code> |
| [18:02] root@bpi-r2:~# ./mmc extcsd read /dev/mmcblk1 | grep PARTITION_CONFIG |
| Boot configuration bytes [PARTITION_CONFIG: 0x00] |
| [18:02] root@bpi-r2:~# ./mmc bootpart enable 1 1 /dev/mmcblk1 |
| [18:03] root@bpi-r2:~# ./mmc extcsd read /dev/mmcblk1 | grep PARTITION_CONFIG |
| Boot configuration bytes [PARTITION_CONFIG: 0x48] |
| </code> |
| ===== Betriebssystem auf EMMC installieren ===== |
| |
| http://forum.banana-pi.org/t/bpi-r2-new-image-ubuntu-16-04-v1-2-1-bt-and-wifi-ap-mode-are-working-fine-2017-11-27/4291 |
| |
| - [[uboot#partition-konfiguration_des_emmc_aendern]] |
| - Schreibmodus für /dev/mmcblk1boot0 aktivieren:<code>echo 0 > /sys/block/mmcblk1boot0/force_ro</code> |
| - Preloader von [[https://github.com/BPI-SINOVOIP/BPI-files/blob/master/SD/100MB/BPI-R2-EMMC-boot0-DDR1600-0k-0905.img.gz|hier]] auf das boot-device schreiben: |
| * <code>gunzip -c BPI-R2-EMMC-boot0-DDR1600-0k-0905.img.gz | sudo dd of=/dev/mmcblk1boot0 bs=1024 seek=0</code> |
| * mit [[https://github.com/BPI-SINOVOIP/bpi-tools/|bpi-tools]]: <code>bpi-bootsel BPI-R2-EMMC-boot0-DDR1600-0k-0905.img.gz /dev/mmcblk1boot0</code> |
| - kopieren des OS-Abbildes auf EMMC (device=/dev/mmcblk1): |
| * <code>unzip -p <XXX.img.zip> | pv | dd of=<device> bs=10M status=noxfer</code> |
| * Alternative (mit [[https://github.com/BPI-SINOVOIP/bpi-tools/|bpi-tools]]): <code>bpi-copy <XXX.img.zip> <device></code> |
| - Ausschalten, SD entfernen und neu hochfahren |
| |
| wenn sd-Karten-Abbild nicht auf emmc passt: [[https://softwarebakery.com/shrinking-images-on-linux|Abbild verkleinern]] |
| |
| ===== manuelles kopieren des Betriebssystems ===== |
| * für ein neues SD-Card-Image wird der Bootblock eines vorhandenen Images benötigt |
| * {{ :bpi-r2:bpi-r2-sd-boot2k.img.gz |erste 2k ohne preloader/uboot}} {{ :bpi-r2:bpi-r2-sd-boot1m.img.gz |erstes MB mit preloader/uboot}} <code>gunzip bpi-r2-sd-boot*.img.gz |
| dd if=bpi-r2-sd-boot1m.img of=/dev/sdx |
| #ggf. partitonstabelle neu einlesen: |
| sfdisk -R /dev/sdx |
| #alternativ aus Paket parted |
| partprobe /dev/sdx |
| </code> |
| * uboot installieren:<code>dd if=BPI-R2-720P-2k.img of=/dev/mmcblk1 bs=1k seek=2 count=1022</code> |
| * Partitionstabelle auf der SD exportieren {{ :bpi-r2:parttable.dat |}} und auf emmc einspielen:<code>root@bpi-r2:~# sfdisk -d /dev/mmcblk0 > parttable.dat |
| root@bpi-r2:~# sfdisk /dev/mmcblk1 < parttable.dat |
| </code> |
| * ggf. checken/vergrößern |
| * Dateisysteme anlegen (mkfs) für p1=vfat (apt-get install dosfstools) und p2=ext4<code>mkfs -t vfat /dev/mmcblk1p1 |
| mkfs -t ext4 /dev/mmcblk1p2</code> |
| * im bestehenden System mount-Punkte anlegen/konfigurieren<code>mkdir -p /mnt/emmc/boot |
| mkdir -p /mnt/emmc/root |
| nano /etc/fstab |
| # <file system> <dir> <type> <options> <dump> <pass> |
| /dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 |
| /dev/mmcblk0p1 /boot vfat defaults 0 0 |
| /dev/mmcblk1p2 /mnt/emmc/root ext4 errors=remount-ro,noauto 0 1 |
| /dev/mmcblk1p1 /mnt/emmc/boot vfat defaults,noauto 0 0 |
| </code> |
| * mounten:<code> |
| mount /mnt/emmc/root |
| mount /mnt/emmc/boot |
| </code> |
| * rootfs entpacken/rüberkopieren<code>rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/boot/*"} / /mnt/emmc/root/ |
| </code> |
| * kernel (p1) und Module (p2) rüberkopieren<code>mkdir -p /mnt/emmc/boot/bananapi/bpi-r2/linux |
| cp /boot/bananapi/bpi-r2/linux/uImage /mnt/emmc/boot/bananapi/bpi-r2/linux |
| mkdir -p /mnt/emmc/root/lib/modules/ |
| cp -r /lib/modules/$(uname -r) /mnt/emmc/root/lib/modules/</code> |
| * uboot auf die richtige Partition konfigurieren<code>sed 's/mmcblk0/mmcblk1/' /boot/bananapi/bpi-r2/linux/uEnv.txt > /mnt/emmc/boot/bananapi/bpi-r2/linux/uEnv.txt</code> |