前言:php
這篇文章介紹如何構建一個完整基於ARM的Ubuntu系統。linux
因爲改文章當初寫的時候是發表在國外產品論壇上面,故保留了原文內容。android
使用到的硬件平臺:Geekboxgit
補充說明:github
雖然Geekbox是基於8核64Bits Cortex-A53 ARMV8架構的CPU,該方法構建的時候採用了向下兼容的32Bits的ARMV7架構。所以,該方法適用於Cortex-A7/A9/A15/A17/A12架構的ARM處理器。web
In this guide, we will describe how to build an ubuntu system for Geekbox from scratch.shell
Different ways to achieve it:ubuntu
Build the whole system in host PC with Chroot(emulator)bash
Build in a removable media device, such as: SDCard or UDisk架構
Build in the target device directly 【current article】
Carry on the following questions before you start your work:
Q: What is included in an ubuntu system?
A: Bootloader & ramfs(kernel + initrd) & rootfs
Q: how to manage your ubuntu projects
A: Continue current reading and think about your own manage mothod.
$ install -d ~/project/geekbox/ubuntu/{linux,initrd,rootfs,prebuilts,archives/{ubuntu-core,debs,hwpacks},images,utils,scripts}$ cd ~/project/geekbox/ubuntu
$ git clone https://github.com/geekboxzone/lollipop_u-boot u-boot
$ git clone https://github.com/geekboxzone/lollipop_kernel -b ubuntu linux
$ git clone https://github.com/geekboxzone/lollipop_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9.git prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/ *Note the full path of 'prebuilts/gcc/linux-x86/arm/arm-eabi-4.6', just to keep Makefile@linux happy*
$ git clone https://github.com/gouwa/initrd.git initrd
$ git clone https://github.com/geekboxzone/ubuntu_hwpacks.git archives/hwpacks
$ wget -P archives/ubuntu-core http://cdimage.ubuntu.com/ubuntu-core/releases/14.04.3/release/ubuntu-core-14.04.3-core-armhf.tar.gz # Visit the following link for the more versions: # [url]http://cdimage.ubuntu.com/ubuntu-core/releases[/url]
$ git clone https://github.com/geekboxzone/utils.git -b ubuntu utils # [Optional]If you want to run the command in any path: # $ sudo cp -a utils/upgrade_tool /usr/local/bin
$ git clone https://github.com/neo-technologies/rockchip-mkbootimg.git mkbootimg
$ make -C mkbootimg/$ sudo make install -C mkbootimg/
The above steps will generate some files in ```/usr/local/bin/``` *See utils/mkbootimg/README.md file for more information* All the preparatory works above are necessary to build an ubuntu. And we also offter some scripts to do thus work: 10. [Optional]Download the scripts: ```bash $ git clone https://github.com/geekboxzone/ubuntu_scripts.git scripts
All the steps above just need to run one time, even if you will build the Ubuntu system many times.
$ make rk3368_box_defconfig -C u-boot/$ make ARCHV=aarch64 -C u-boot/
$ cp -a u-boot/RK3368MiniLoaderAll_V*.bin u-boot/uboot.img u-boot/trust.img images/
$ alias Make='make ARCH=arm64'$ Make -C linux ugeekbox_defconfig$ Make -C linux geekbox.img -j8 or 7.9-inch CrossDisplay $ Make -C linux cross.img -j8
$ cp -a linux/resource.img images/
$ make -C initrd
SHA match for u-boot:
$ truncate -s '%4' images/initrd.img #View SecureNSModeBootImageShaCheck() function in following file for the information: #u-boot/board/rockchip/common/SecureBoot/SecureVerify.c
$ mkbootimg --kernel linux/arch/arm64/boot/Image --ramdisk images/initrd.img -o images/ramfs.img
Notice: Many following steps need the root privileges, do not forget to type sudo if necessary.
$ dd if=/dev/zero of=images/rootfs.img bs=1M count=256 # Modify the count value as you want. # NOTE: if you want to build the rootfs on the host PC, recommend 2.5GB for GUI building.
$ mkfs.ext4 -F -L linuxroot images/rootfs.img Notice: 'linuxroot' is the volume-label of the rootfs, it MUST BE EXACTLY MATCH the CMDLINE in parameter: CMDLINE: console=ttyS2 root=LABEL=linuxroot Otherwise, there will be similar mistakes as follow when mount the rootfs: [quote]Gave up waiting for root device. Common problems: - Boot args (cat /proc/cmdline) - Check rootdelay= (did the system wait long enough?) - Check root= (did the system wait for the right device?) - Missing modules (cat /proc/modules; ls /dev) ALERT! /dev/disk/by-label/ does not exist. Dropping to a shell! (initramfs)[/quote]
$ rm -rf rootfs && mkdir rootfs
$ sudo mount -o loop images/rootfs.img rootfs
$ sudo rm -rf rootfs/lost+found
$ sudo tar xzf archives/ubuntu-core/ubuntu-core-14.04.3-core-armhf.tar.gz -C rootfs/ Tips: ubuntu-core is the minimal root file system.
$ sudo cp -a archives/hwpacks/system/ rootfs/
$ sudo cp archives/hwpacks/wifibt/wifion rootfs/usr/local/bin/ $ sudo cp archives/hwpacks/wifibt/wifioff rootfs/usr/local/bin/ $ sudo cp archives/hwpacks/wifibt/wifi.conf rootfs/etc/init $ sudo cp archives/hwpacks/wifibt/bluetooth.conf rootfs/etc/init $ sudo cp archives/hwpacks/wifibt/bluetooth-ap6354.conf rootfs/etc/init `` 9. Setup serial console, booting as root user: ```bash $ sudo sed -e 's/tty1/ttyS2/g' -e '/^exec/c exec /sbin -a root -L 115200 ttyS2 vt100' < rootfs/etc/init/tty1.conf > ttyS2.conf $ sudo mv ttyS2.conf rootfs/etc/init/ttyS2.conf
$ echo Geekbox > hostname$ sudo mv hostname rootfs/etc/hostname
Congratulations!
At this point, you have completed all the minimal-ubuntu images.
And so, all you should do is to burn these images down to device.
$ upgrade_tool ul images/RK3368MiniLoaderAll_V2.40.bin
$ upgrade_tool di -p utils/rockdev/parameter
$ upgrade_tool di uboot images/uboot.img$ upgrade_tool di trust images/trust.img
$ upgrade_tool di resource images/resource.img
$ upgrade_tool di ramfs images/ramfs.img
$ upgrade_tool di linuxroot images/rootfs.img
$ upgrade_tool rd # Notice: root access is necessary if you haven't setup udev rules. #View our Wiki for more information:[url]http://forum.geekbox.tv/viewtopic.php?f=2&t=42[/url]
NOTE: The following commands need run on your Geekbox target!
root@Geekbox:~# echo auto eth0 > /etc/network/interfaces.d/eth0 root@Geekbox:~# echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0 root@Geekbox:~# ln -fs /run/resolvconf/resolv.conf /etc/resolv.conf root@Geekbox:~# ifup eth0
root@Geekbox:~# resize2fs /dev/disk/by-label/linuxroot Tips: the default volume size of root partition is specify in the first step of [Build the rootfs].
root@Geekbox:~# apt-get update root@Geekbox:~# apt-get upgrade root@Geekbox:~# apt-get install ubuntu-desktop
Backup the ubuntu deb packages:
root@Geekbox:~# apt-get install openssh-server root@Geekbox:~# scp /var/cache/apt/archives/*.deb gouwa@192.168.1.168:project/geekbox/ubuntu/archives/debs # If you did this, next time when you rebuilt the ubuntu system, # you can manually pull the deb packages into the apt debs archives path of target-device: # root@Geekbox:~# scp gouwa@192.168.1.168:project/geekbox/ubuntu/archives/debs/*.deb /var/cache/apt/archives # root@Geekbox:~# apt-get update && apt-get upgrade && apt-get install ubuntu-desktop # This will save you a lot of time to download them from the website.
root@Geekbox:~# reboot
T.B.D.
1> ubuntu system depth optimization
2> Building the arm64 ubuntu system