1. 程式人生 > >如何構建一個arm64 AArch64的Ubuntu rootfs

如何構建一個arm64 AArch64的Ubuntu rootfs

本文參考自

的文章 ,本文將實現如何通過Ubuntu-core在Aarch64上構建最小的Ubuntu檔案系統。

1 下載檔案建立rootfs資料夾

mkdir ~/rootfs && cd ~/rootfs
wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.2-base-arm64.tar.gz
mkdir ubuntu-rootfs
tar -xvf ubuntu-base-16.04.2-base-arm64.tar.gz -C ubuntu-rootfs
cd ubuntu-rootfs ls

檢視當前路徑下的檔案結構已經OK

bin   dev  home  media  opt   root  sbin  srv  system  usr
boot  etc  lib   mnt    proc  run   snap  sys  tmp     var

2 安裝qemu-user-static搭建arm64模擬環境

此時位於 ~/rootfs/ubuntu-rootfs/ 路徑下,需要安裝qemu-user-static並拷貝qemu-aarch64-static到當前路徑的 usr/bin/下。

apt-get install qemu-user
-static cp /usr/bin/qemu-aarch64-static usr/bin cp -b /etc/resolv.conf etc/

3 chroot 到 模擬arm64的檔案系統下

#建立ch-mount.sh 指令碼
cd ../
vi ch-mount.sh

將以下的內容複製到ch-mount.sh中即可。

#!/bin/bash
# 
function mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc ${2}proc
    sudo mount -t sysfs /sys ${2}sys
    sudo
mount -o bind /dev ${2}dev sudo mount -o bind /dev/pts ${2}dev/pts sudo chroot ${2} } function umnt() { echo "UNMOUNTING" sudo umount ${2}proc sudo umount ${2}sys sudo umount ${2}dev/pts sudo umount ${2}dev } if [ "$1" == "-m" ] && [ -n "$2" ] ; then mnt $1 $2 elif [ "$1" == "-u" ] && [ -n "$2" ]; then umnt $1 $2 else echo "" echo "Either 1'st, 2'nd or both parameters were missing" echo "" echo "1'st parameter can be one of these: -m(mount) OR -u(umount)" echo "2'nd parameter is the full path of rootfs directory(with trailing '/')" echo "" echo "For example: ch-mount -m /media/sdcard/" echo "" echo 1st parameter : ${1} echo 2nd parameter : ${2} fi

通過ch-mount.sh指令碼chroot到arm64的檔案系統下

./ch-mount.sh -m ubuntu-rootfs

4 安裝基礎的軟體包

apt-get install \
  language-pack-en-base \
  sudo \
  ssh \
  net-tools \
  network-manager \
  iputils-ping \
  rsyslog \
  bash-completion \
  htop \

5 系統基礎的修改

新增使用者、設定合適的組並設定密碼

useradd -s '/bin/bash' -m -G adm,sudo yourusername
echo "Set password for yourusername:"
passwd yourusername
echo "Set password for root:"
passwd root

設定主機名

echo 'ubuntu.yourusername' > /etc/hostname

設定自動更新DNS

dpkg-reconfigure resolvconf

配置登入的串列埠

因為暫時未安裝桌面,所以這裡的配置要具體和核心中登入的串列埠的裝置對應起來,不然對導致無法通過串列埠登入的問題。

在 /etc/init/ 下新增或修改ttyS0.conf

start on stopped rc or RUNLEVEL=[12345]
stop on RUNLEVEL [!12345]
respawn
exec /sbin/getty -L 115200 ttyFIQ0 vt102

本文環境的登入串列埠為ttyFIQ0,具體可能會因為目標板差異而不同,具體要參考所使用的平臺進行修改。

6 退出並製作可燒錄的韌體

退出arm64模擬檔案系統

exit
./ch-mount -u ubuntu-rootfs

使用dd指令製作空的韌體容器

dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
sudo  mkfs.ext4  ubuntu-rootfs.img

將arm64檔案系統內容製作到ubuntu-rootfs.img

mkdir  ubuntu-mount
sudo mount ubuntu-rootfs.img ubuntu-rootfs/
sudo cp -rfp ubuntu-rootfs/*  ubuntu-mount/
sudo umount ubuntu-mount/
e2fsck -p -f ubuntu-rootfs.img
resize2fs -M ubuntu-rootfs.img

Finished