Ok, I updated the boot manager so it is now more portable and added some convenience features as well.
Be aware that it is not beginner friendly, you need at least some knowledge about writing and editing u-boot scripts, Uart cable is not needed but can be useful during testing and setting up.
I rewrote the script in python using curses so It's now more elegent (in my opinion anyway) I tried to get it as close as I can to look like grub2 interface:
Now let's explain How it works:
First, the sdcard must contain at least two fat32 partitions:
-First partition(fat32) (label=RECOVERY) content:
This partition contains the main boot manager files:
1-aml_autoscript is the script that is used to update the u-boot environment to allow for our method to work
2-dtb.img a dtb file, make sure to replace it with the appropriate one for your device I compiled it from coreelec source https://github.com/CoreELEC/device-trees-
amlogic
3-Image is the kernel image of the boot manager
4- multiboot.script is the script that is executed to display the boot manager
5-update.zip use this in your update app in android to flash the aml_autoscript above and make the bootloader ready for our boot manager
-Second Partition(fat32) (label=BOOT) content:
This partition contains at least the config.yaml file that contains general settings for the boot manager and the boot entries to be listed.
Mote that I have a folder(multiboot) that contains the boot files for my distros(kernel,initrd,dtb and boot script) you don't have to put them in this partition you can put them anywhere (another partition on the sd card, a USB drive or even in the internal EMMC) just make sure to have the correct path and device id for them in the config.yaml file.
Also If you want to use the remote control instead of a keyboard to select the os place the correct remote.conf of your remote in the root of this partition.
the structure of config.yaml is like this:
generalSettings:
default: 5
rememberboot: true
timeout: 10
menu:
- bootscript: /multiboot/COREELEC/u-boot.script
device: mmc 0:2
devicefs: fat
name: COREELEC
- bootscript: /multiboot/armbian-3.14.29-mate/u-boot.script
device: mmc 0:2
devicefs: fat
name: armbian-3.14.29-mate
- bootscript: /multiboot/dvb_test/u-boot.script
device: mmc 0:2
devicefs: fat
name: dvb_test
- bootscript: /multiboot/kernel-3.14/u-boot.script
first you set the general settings:
- timeout: this is how many seconds the boot manager should wait before booting into the default boot entry
- default: this is the zero based index of the default distro that the boot manager will boot to after timeout, note that index 0 is reserved for the internal EMMC boot so your menu starts at index 1.
- rememberboot: if this is set to true then the manager will remember the entry that you selected and save it's index in the default entry above so the next time you boot this will be your default entry.
after that you add your menu entries:
- name: is the name of the distribution displayed in the boot menu
- bootscript: this is the path of the bootscript of the distribution (note that this boot script should be capable of booting the distro on it's on, so it must have the correct path of the boot files and pass the correct root parameter to the kernel, see the example u-boot.script files that are included in each distibution)
- device is the device that contains the bootscipt using u-boot format so the first mmc and second partition would be mmc 0:2 , the second mmc and third partiton would be mmc 1:3 .
- devicefs is the filesystem type of the above device, this is usually fat because most of these tv boxes support loading files of only fat32 partitions (except some boards like khadas vim and odroid whose bootloader support ext4 partitions)
now let's see an example of a disto bootscript:
this the same bootscript that was shipped with balbes150 image I only edited the device to mmc 0:2 because this is where I have my kernel and other boot files, also I prepended the correct path before each file name.
In the uEnv.ini file of this distro I edited the root parameter to use a partition labeled "Debian-3-xfce" and created that partiton using gparted
I prepared a boot image that contains the boot manager and two distibutions, Coreelec and Debian server.
download the image here and burn it to a new sdcard then use the update application in android and update using update.zip, after that you'll see the boot menu after the reboot
https://drive.google.com/open?id=1dhpcqNrqbW493SK8J_Er9b-ZipJkTfd3
Below is the old method
Hi,
This is my quick and dirty solution to multiboot any amlogic device(actually it can be used on any device that uses u-boot with slight modification):
***Warning: the following method was only tested on one device which is KII PRO, I made this method for my own use ,it is a long and a bit complicated to setup for non-experienced users if you want to try it you are trying it at your own risk, I take no responsibility for any damage that may occur to your device.
Preparing the sd card for multiboot:
1- Download the zip file from the attachments multiboot.zip
2-wipe everything in your sdcard (i used a 16 gb card) and create 2 partitions:
-The first one is a fat32 partition, this can be small partition (for me i made it 1gb) it will contain the boot files for the main multiboot system and for any other distributions,i labeled this partition "BOOT".
-The second partition is ext4 partition which will contain the rootfs of your distributions in raw image format, this need to be a big partition i suggest you assign all remaining available space to this partition, also you need to label it "ROOTFS" (this is mandatory).
you can use whatever tools you want(gparted,fdisk...etc)
3-mount the partitions and extract the zip file to the root of your boot partition(the fat32 partition) and create an empty folder called ‘multiboot’ inside the root of the first and second partitions, so the first partition content should look like this
▶ tree
.
├── aml_autoscript
├── aml_autoscript.zip
├── multiboot
├── config.txt
├── dtb.img
├── s905_autoscript
├── s905_autoscript.cmd
├── umbInitrd
└── zImage
and the second partition should look like this
▶ tree /run/media/mohammad/ROOTFS/
└── multiboot
the ‘multiboot’ folder in the first partition should contains folders with the name of the distro and inside them are the bootfiles of that distro(kernel,dtb,initramfs and s905_autoscript file) the ‘multiboot’ folder in the second partition should contain the same folders as in the first partition and inside the folder there should be an ext4 image of the rootfs of the distro
4- The dtb file i used is for kii pro tv box and you should replace that with the dtb of your device, you can get that from any of balbes150 distributions(3.14.29 kernel).
Now you'r ready to boot, all you need is some distros
Preparing the distros:
You can make a partition for each distro on your sd card and use it to store the rootfs but i chose a more portable solution by making a raw partition image for each distro and pass it to the initramfs to be mounted as a loop device.
I will be using one of balbes150 distros as an example (Armbian_5.32_S9xxx_Ubuntu_xenial_3.14.29_mate_20170907.img.xz)
1-First extract the file
▶xz -k -v -d Armbian_5.32_S9xxx_Ubuntu_xenial_3.14.29_mate_20170907.img.xz
2- Now mount the resulting file partitions to some directories, I use kpartx to do it for me automatically
▶sudo kpartx -av Armbian_5.32_S9xxx_Ubuntu_xenial_3.14.29_mate_20170907.img
add map loop0p1 (254:0): 0 262144 linear 7:0 2048
add map loop0p2 (254:1): 0 8812544 linear 7:0 264192
now mount the loop devices (i use udiskctl)
▶ udisksctl mount -b /dev/mapper/loop0p1
Mounted /dev/dm-0 at /run/media/mohammad/BOOT1.
▶ udisksctl mount -b /dev/mapper/loop0p2
Mounted /dev/dm-1 at /run/media/mohammad/ROOTFS1.
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 2.0G 215M 1.8G 11% /run/media/mohammad/BOOT #this is my sd card #1 partition
/dev/sdb2 13G 6.8G 4.8G 59% /run/media/mohammad/ROOTFS #this is my sd card #2 partition
/dev/mapper/loop0p1 128M 53M 76M 42% /run/media/mohammad/BOOT1 #this is the mounted distro image #1 partition
/dev/mapper/loop0p2 4.1G 2.9G 1.1G 75% /run/media/mohammad/ROOTFS1 #this is the mounted distro image #2 partition
3- create a folder with the name of the distro in the multiboot folder you created earlier (in the first and second partitions of your sd card) then copy all the boot files of your distro to the folder in the first partition
▶ mkdir /run/media/mohammad/BOOT/multiboot/armbian-3.14.29-mate #this is the first(fat32)partition
▶ mkdir /run/media/mohammad/ROOTFS/multiboot/armbian-3.14.29-mate #this is the second (ext4) partition
▶ cp /run/media/mohammad/BOOT1/* /run/media/mohammad/BOOT/multiboot/armbian-3.14.29-mate/
4- now you need to create an ext4 partition image to contain the rootfs of your distro for me I made a 4GB image
fallocate -l 4G system.img
mkfs.ext4 system.img
5-mount the image
▶ sudo losetup $(losetup -f) system.img
▶ udiskctl mount -b /dev/loop1
Mounted /dev/loop1 at /run/media/mohammad/71545ae9-33c7-4d99-963e-a5a915464078.
6-copy all the files from the rootfs of your distro image to the newly created image
▶ cp /run/media/mohammad/ROOTFS1/* /run/media/mohammad/71545ae9-33c7-4d99-963e-a5a915464078/
UPDATE: edit the "/etc/fstab" inside the system.img file
nano /run/media/mohammad/71545ae9-33c7-4d99-963e-a5a915464078/etc/fstab
and comment out the lines that start with "LABEL=ROOTFS" and "LABEL=BOOT" by adding a hash at start of each line
then add these lines to the file :
/dev/mmcblk1p1 /mnt vfat defaults 0 2
/mnt/multiboot/armbian-3.14.29-mate/ /boot none bind
this will fix the 0hdmi.service problem
7- unmount everything
▶ umount /dev/loop1
▶ umount /dev/mapper/loop0p1
▶ umount /dev/mapper/loop0p2
8-copy the system.img file to your distro folder in the second partition of your sd card
▶ cp system.img /run/media/mohammad/ROOTFS/multiboot/armbian-3.14.29-mate
9- move to your distro folder in the first partition of your sdcard:
▶ cd /run/media/mohammad/BOOT/multiboot/armbian-3.14.29-mate
10- now you need to edit the s905_autoscript.cmd file ( I use nano editor, you can use any text editor you like), you need to make two types of edits in this file
- add loop=${mbpath}/system.img to the kernel arguments
- add ${mbpath}/ before each of uInitrd, zImage and dtb.img
so this
becomes this
Note that I removed the lines of booting from usb to decrease the boot time because I know that I’m booting from the sd card, you can leave them if you want.
11- compile the script
▶ mkimage -A arm64 -O linux -T script -C none -d s905_autoscript.cmd s905_autoscript
12-copy the dtb file of your device
▶ cp dtb/gxbb_p200_2G.dtb dtb.img
Modifying u-boot and booting:
insert the sd card in the tvbox and then go to the update and backup app and select zip file to update from and choose aml_autoscript.zip that is on the root of the sd card, the device should reboot and you should now be able to use the multiboot function
UPDATE: after booting into the distro disable the resize2fs service using the following command
sudo systemctl disable resize2fs
Notes(mostly for other developers):
1-I’m a very bad shell programmer, I mostly used snippet from stackoverflow to write the main script (bin/wselector) if you could improve the script or anything in my method that would be appreciated.
2-boot time is very good but there is always a possibility to improve it, somethings that I can think of are:
-buiding a smaller kernel by disabling everything in the kernel except for the framebuffer,mmc and nand driver, fat32 and ext4 filesystem,unfortunately whenever I disable something in the kernel it fails to build
-maybe building a minimum dtb file so that the kernel doesn’t spend time initializing peripherals we don’t need.
-building all binaries in umbInitrd staticaly
If data need to be recorded network boot with nfs will be needed but if it's just to run an small emmbedded project, it's possible to load rootfs in ramdisk and remove the sdcard in case you don't use a spi flash to boot.
It's work fine for sure with openwrt but armbian is too big to fit in ram
Why spreading so much confusion? Both boards have own wiki pages provided by technical writers so there's no need to focus on temporary mistakes their marketing folks might make.
Main difference between both boards is that Core2 features an RTL8211 GbE PHY while Core uses the SoC's internal Fast Ethernet PHY. And I hope they stay with H3 (or H2+ since essentially the same) on Core and H5 on Core2 and do not start with stupid SoC exchanges since this only leads to confusion and users picking up the wrong OS images.
Peripherals (heatsink included) are all compatible and they designed the boards fortunately backwards compatible. Pin headers soldered or not can be decided in the store at checkout time (I assume the Core when ordered together with the Mini Shield comes with them presoldered, I can't imagine FE repeating the same mistake as with the first NAS expansion bay).
Size of DRAM is choosable and eMMC optional. Which combinations might be available might change over time (based on feedback/demand)
There's USB OTG on the Micro USB port (other boards do it differently eg Tritium and NEO Plus 2 so it's worth to mention since both boards even without pin headers soldered can provide limited network connectivity through g_ether module) and the boards can be powered through pin headers too. Ethernet implementation is interesting since they offer the same Mini Shield for both variants so it should be possible to combine the Core2 with an external GbE MagJack as long as traces are short and most probably of same length ( didn't look into schematic yet).
Software support efforts seem to be minimal (more or less only DT stuff and maybe checking for GbE TX/RX delay adjustments) and at least with the Core I wouldn't consider Micro USB for DC-IN a show stopper...
I've ported the new code provided by Ayaka but I still need to test it. Since I'm using a different MiQi, I have to recompile mpp (done) and mpv.
The last one is posing several issues since it wants a pretty recent version of FFMPEG. I'll see whether I compile a new local version of ffmpeg of if I upgrade from Ubuntu Xenial to Ubuntu Artful to resolve this issue.
Thank you very much tkaiser! Thank you all!
Works great! Problem solved!
Message to descendants :
1) Taking out of control of the respective driver
# cd /boot
# bin2fex ./bin/orangepione.bin > newbin
# nano ./newbin
Change line 'usb_drv_vbus_gpio = port:PL02<1><0><default><0>' on 'usb_drv_vbus_gpio = '
# rm ./script.bin
# fex2bin ./newbin > script.bin
# rm ./newbin
!REMEMBER! - after reboot power on USB OTG port will be OFF by default!
# reboot
2) Export gpio pin PL02.
To obtain the correct number you have to calculate it from the pin name. Use this formula:
(position of letter in alphabet - 1) * 32 + pin number
(HL02) letter L - stay on 12 position in alphabet.
(HL02) pin number - 2
result:
(12-1)*32+2=354
Use GPIO sysfs do next:
# echo 354 > /sys/class/gpio/export
# echo "out" > /sys/class/gpio/gpio354/direction
Power ON
# echo 1 > /sys/class/gpio/gpio354/value
Power OFF
# echo 0 > /sys/class/gpio/gpio354/value
You're welcome. X2goserver on OPI is definitely on my wishlist and your information is very much appreciated. For pure linux environments I prefer x2goserver/x2goclient over xrdp/rdesktop, except for android clients which lack x2goclient capabilities.
I'll try your recipe to get a working x2goserver on arm and report back.
Just set up a working x2goserver installation as per your instructions. Thanks, you are my hero !
Screenshot of x2goclient running in (virtual) windows7 connected to x2goserver running on OPIONE.
Thanks for tutorial, i discover rdesktop / xrdp...
But i would try to make thing in the reverse way : Put x2goserver on OPPC and view from remote (linux or windows).
It's finally easy with all needed .deb files and some helper from web.
apt-get install libc6 lsof bc openssh-server openssh-client libconfig-simple-perl pwgen libdbd-pg-perl libdbd-sqlite3-perl libfile-basedir-perl libcapture-tiny-perl adduser xauth psmisc net-tools sshfs x11-apps x11-session-utils x11-utils x11-xfs-utils x11-xkb-utils x11-xserver-utils fontconfig xinit xfonts-base x11-common
wget http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian/pool/main/libj/libjpeg8/libjpeg8_8d-1+deb7u1_armhf.deb
sudo dpkg [--force-conflicts --force-depends] -i libjpeg8_8d-1+deb7u1_armhf.deb
git clone https://github.com/kapolos/armhf-x2go.git
cd armhf-x2go-master/
sudo dpkg [--force-depends] -i *.deb
sudo apt-get -f install
WILL INSTALL ===> cups cups-client cups-common cups-core-drivers cups-daemon cups-filters cups-filters-core-drivers
cups-ppdc cups-server-common desktop-file-utils ghostscript gsfonts libcupscgi1 libcupsmime1
libcupsppdc1 libfile-which-perl libfontembed1 libqpdf13 poppler-utils ssl-cert
sudo apt-get install x2goclient on the remote machine. run x2goclient and type (server ip address) and your username and pwd as your remote ssh acces.
Enjoy!
I m happy to find my x2go app. Also a real firefox (firefox_45.0.2+build1-0ubuntu0.12.04.1_armhf.deb) (Webgl support with mesa compiled = glmark2 give 5 poor points but it's work lol
Nope - just x2goclient on Armbian. Successfully installed xrdp/tightvnc on OPI ONE and accessed it via rdesktop client from linux and aRDP from android.
For graphical access to OPI ONE running remotely through firewalls, I tunnel and relay the rdesktop-session via ssh/x2goserver running on a x86 server.
see http://forum.armbian.com/index.php/topic/1044-remote-desktop-fun-with-armbian-505-on-opi-one/