環境:
- HelperA64開發板
- Linux3.10內核
- 主機:ubuntu16.04
目標:定制ubuntu-core rootfs鏡像
一、下載ubuntucore文件系統
下載地址:http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/
ubuntu下使用wget來快捷下載
wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04.3-base-arm64.tar.gz
創建ubuntucore與rootfs文件夾,然后解壓ubuntucore文件系統到rootfs中。然后刪除ubuntucore文件系統。
mkdir -p ubuntucore/rootfs
cp ubuntu-base-18.04.3-base-arm64.tar.gz ubuntucore/rootfs
cd ubuntucore/rootfs
tar -xvf ubuntu-base-18.04.3-base-arm64.tar.gz
rm -rf ubuntu-base-18.04.3-base-arm64.tar.gz
二、qemu的下載與使用
1、在PC上模擬運行根文件系統。需要安裝一個工具:
sudo apt-get install qemu-user-static
然后輸入命令:
cd ubuntucore
sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/
2、新創建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 chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
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
創建完成后給mount.sh可執行屬性:
chmod +x ch-mount.sh
3、虛擬根文件系統的運行與退出
運行:
./ch-mount.sh -m rootfs/
退出:
exit
./ch-mount.sh -u rootfs/
如下圖:
注:
- 如果退出虛擬根文件系統沒有執行./mount.sh -u rootfs而重復執行執行./mount.sh -m rootfs。將會導致系統出故障,只能重新啟動電腦,然后才能進入虛擬根文件系統。
三、安裝必要的軟件
1、拷貝主機網絡配置到虛擬根文件系統(這樣才能安裝軟件),命令如下:
cd ubuntucore/
sudo cp -b /etc/resolv.conf rootfs/etc/resolv.conf
2、安裝軟件
./ch-mount.sh -m rootfs/
apt update
apt install wget udev kmod iproute2 net-tools systemd vim
apt-get install language-pack-en-base sudo ssh ethtool
apt-get install wireless-tools ifupdown network-manager iputils-ping
rsyslog
apt-get install bash-completion htop lrzsz --no-install-recommends
如果出現如下圖錯誤,重新改下 tmp 目錄的權限: chmod 777 /tmp/
四、用戶設置
給系統增加一個帳號:szbaijie
useradd -s '/bin/bash' -m -G adm,sudo szbaijie
修改 szbaijie 用戶密碼,回車后按提示輸入兩次密碼:
passwd szbaijie
設置 root 權限的密碼命令為 szbaijie:
passwd root
注:
- 在 root 用戶下給 szbaijie 增加 sudo 用戶權限。vi 進入/etc/sudoers/中在 root 一行下面加入內容:szbaijie ALL=(ALL:ALL) ALL
1、 當開發板 root 登陸操作系統界面時,會出現警告,修改如下:
vi /root/.profile
然后將 mesg n 替換為 tty - s && mesg n
2、ping 不能正常工作的問題(超級郁悶的問題):
vi /etc/group
在文件最后加入:
inet:x:3003:root
net_raw:x:3004:root
3、xshell 中 vim 進入后 xshell 只顯示一半和亂碼的問題
vim /root/.bashrc
在文件最后加入
export TERM=xterm
4、原有的設備文件不可寫,所以編譯打包會出錯,打包不了,所以需要刪除。
如果 dev 下為空,不用刪除了。如果不為空,則將黃色部分全部刪除,命令如下:
cd ubuntucore/rootfs/dev/
rm -rf full null ptmx random tty urandom zero
5、退出虛擬根文件系統都要執行修改下用戶權限,命令如下:
chown -R 用戶名.用戶名 rootfs
六、設置啟動腳本與服務
mkdir rootfs/usr/lib/systemd/system/
cd rootfs/usr/lib/systemd/system/
然后建立firstboot.sh、firstboot.service和rcs.service和rcS
1、firstboot.sh
#!/bin/sh
mkfs.ext4 /dev/mmcblk0p1
chmod +s /usr/bin/sudo
chmod a+s /bin/su
chown -R szbaijie:szbaijie /home/szbaijie/
chown lightdm:lightdm -R /var/lib/lightdm
chown colord:colord -R /var/lib/colord/
rm -rf /etc/systemd/system/multi-user.target.wants/firstboot.service
exit 0
2、firstboot.service
[Unit]
Description=fristboot-Service
Before=rcS.service
[Service]
Type=forking
ExecStart=/usr/lib/systemd/system/firstboot.sh start
[Install]
WantedBy=multi-user.target
3、rcS
#!/bin/sh
mkdir /data
mount -t ext4 /dev/mmcblk0p1 /data
alias ll='ls -l'
insmod /lib/modules/`uname -r`/usbnet.ko
insmod /lib/modules/`uname -r`/asix.ko
insmod /lib/modules/`uname -r`/sunxi-keyboard.ko
insmod /lib/modules/`uname -r`/disp.ko
insmod /lib/modules/`uname -r`/8723bs.ko
insmod /lib/modules/`uname -r`/videobuf2-dma-contig.ko
insmod /lib/modules/`uname -r`/vfe_io.ko
insmod /lib/modules/`uname -r`/gc2145.ko
insmod /lib/modules/`uname -r`/gc0312.ko
insmod /lib/modules/`uname -r`/vfe_v4l2.ko
insmod /lib/modules/`uname -r`/gt9xxnew_ts.ko
dhclient eth0 &
4、rcs.service
[Unit] Description=rcS-Service After=rcS.service [Service] Type=forking ExecStart=/usr/lib/systemd/system/rcS start
[Install] WantedBy=multi-user.target
5、使能firstboot.service、rcs.service服務
進入虛擬根文件系統,執行以下命令。
使能后會在/etc/systemd/system/multi-user.target.wants/ firstboot.service 指向我們建立的 firstboot.service(指向下圖)。
同理,rcs.service服務也是這樣。
6、設置完后,退出虛擬根文件系統並設置目錄擁有者(每次退出都要操作這個)。
最后,將 rootfs 用 tar 命令壓縮打包為保存好(接下來就是安裝xfce桌面環境了)。
sudo tar -zcvf ubuntu_core_18.04.tar.gz rootfs/
七、安裝桌面環境xfce
1、進入虛擬根文件系統中,然后執行以下命令:
./ch-mount.sh -m rootfs/
apt-get install lightdm
如果出現以下錯誤:
執行以下命令可消除錯誤:
chmod 777 rootfs/tmp/
在安裝 lightdm(桌面顯示管理器)時,會出現時區、地區等選擇,選擇對應位置就行。如下:
2、 安裝完 lightdm 后,就是安裝桌面環境xfce。
apt-get install --no-install-recommends xubuntu-desktop –y
3、設置 root 用戶下打不開 gnome-terminal 的問題:
vi /etc/default/locale
在里面添加:LANG=zh_CN.UTF-8
然后執行下列命令,root 用戶就能啟動 gnome-terminal 終端了
locale-gen zh_CN.UTF-8
最后,退出虛擬根文件系統。
八、打包
具體的打包過程參考 HelperA64 參考手冊的第八章,其他平台按照其他平台方式打包。
有時候我們打包會失敗,查到原因如下
然后給 void 權限就可以成功打包了。
chmod 777 rootfs/var/lib/snapd/void/
九、替換源
以 root 身份打開 sources.list,將 :http://ports.ubuntu.com/ 全部替換為中科大的源:http://mirrors.ustc.edu.cn/ubuntu-ports/。
cd ubuntucore/
vi rootfs/etc/apt/sources.list
vi 進入 sources.list 時,命令行模式下輸入下面命令一鍵替換源:
:%s/ports.ubuntu.com/mirrors.ustc.edu.cn/g
十、總結
在制作的過程中會遇到麻煩和挫折,多去查資料和操作就能成功,在此基礎上可以搞出更多的功能。