前面两篇,我们通过裁剪内核,构造了一个自定义内核,但是官方的根文件系统太大,有13G之多,而nano的emmc版本带的flash只有16gb,所以,根文件系统的裁剪势在必行。基于此,我们根据ubuntu基本的根文件创建自己的自定义文件系统。
整个过程我参考官网论坛的一些资料,做成了两个脚本,直接放在一个目录里面运行
sudo ./make_rootfs
即可在当前目录下的build目录下生成根文件系统,将build目录下的所有文件复制到/Linux_for_Tegra/rootfs目录下,运行以下指令:
cd ..
sudo ./apply_binaries.sh
这一步是用来安装NVIDIA的图形加速库,如果不运行,就失去了用这个板子的意义。
后面直接运行flash.sh脚本烧录即可!(烧录方法参见前两篇)
一、make_rootfs.sh
该脚本主要用来打包根文件,以及后续的一些清理工作。就是我们通常在主机上使用的qemu虚拟机。
其中的URL_ROOTFS_TGZ_BASE
即ubuntu官方的基本根文件包,如果使用其他版本,请自行查找对应的版本。
另外,我是在ubuntu 18.04版本的主机上制作的,其他版本未做测试,请知悉。
#!/bin/bash
URL_ROOTFS_TGZ_BASE=http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04.5-base-arm64.tar.gz
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
BUILD_DIR=$SOURCE_DIR/build
rm -r $BUILD_DIR
mkdir -p $BUILD_DIR
cd $BUILD_DIR
# download and extract rootfs
wget -O rootfs.tar.gz $URL_ROOTFS_TGZ_BASE
tar -xpf rootfs.tar.gz
rm rootfs.tar.gz
# chroot to rootfs
QEMU_PATH=/usr/bin/qemu-aarch64-static
if [ ! -f "$FILE" ]; then
apt-get install qemu-user-static
fi
cp $QEMU_PATH $BUILD_DIR/usr/bin/
mount /sys $BUILD_DIR/sys -o bind
mount /proc $BUILD_DIR/proc -o bind
mount /dev $BUILD_DIR/dev -o bind
mv $BUILD_DIR/etc/resolv.conf $BUILD_DIR/etc/resolv.conf.saved
cp /etc/resolv.conf $BUILD_DIR/etc
cp $SOURCE_DIR/install.sh $BUILD_DIR/
LC_ALL=C chroot $BUILD_DIR /bin/bash -c ./install.sh
rm $BUILD_DIR/install.sh
echo "<================We are unmounting==============>"
umount $BUILD_DIR/sys
umount $BUILD_DIR/proc
umount $BUILD_DIR/dev
mv $BUILD_DIR/etc/resolv.conf.saved $BUILD_DIR/etc/resolv.conf
rm $BUILD_DIR/usr/bin/qemu-aarch64-static
rm -rf $BUILD_DIR/var/lib/apt/lists/*
rm -rf $BUILD_DIR/dev/*
rm -rf $BUILD_DIR/var/log/*
rm -rf $BUILD_DIR/var/tmp/*
rm -rf $BUILD_DIR/var/cache/apt/archives/*.deb
rm -rf $BUILD_DIR/tmp/*
二、intstall.sh
该脚本是关键的制作根文件系统的脚本。
主要工作是做了一些基本环境的配置,包含用户名,一些图形库必须的lib
库。还有一些jetson nano必须的第三方工具等的下载和安装。脚本里面的一些下载网址可能会随着官方更新而下载失败,请自行更新!
有一点需要指出的是,我们增加用户的时候,一般的在命令行直接输入useradd ,然后输入密码,其实可以通过openssl直接设置密码。
useradd -p 密码
只不过这里的密码必须是密文,也就是,我们先通过openssl passwd -crypt来设置密码,然后将密文传入作为p的参数。即
PASSWORD=$(openssl passwd -crypt)
useradd -m -p $PASSWORD -s /bin/bash careray
上面的命令即会按照输入的明文密码,加密后添加用户careray。
#!/bin/bash
# update apt cache
apt-get update
# create user
apt-get install -y openssl
echo "Please provide the default password for the user:"
PASSWORD=$(openssl passwd -crypt)
useradd -m -p $PASSWORD -s /bin/bash careray
usermod -aG sudo careray
# install openssh
apt-get install -y openssh-server
# remove old docker version
apt-get remove \
docker \
docker-engine \
docker.io \
containerd \
runc
# install dependencies
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
binfmt-support \
device-tree-compiler \
libasound2 \
libcairo2 \
libdatrie1 \
libegl1 \
libegl1-mesa \
libevdev2 \
libfontconfig1 \
libgles2 \
libgstreamer-plugins-base1.0-0 \
libgstreamer1.0-0 \
libgtk-3-0 \
libharfbuzz0b \
libinput10 \
libjpeg-turbo8 \
libpixman-1-0 \
libpangocairo-1.0-0 \
libpangoft2-1.0-0 \
libpng16-16 \
libssl-dev \
libunwind8 \
libwayland-cursor0 \
libwayland-egl1 \
libx11-6 \
libxext6 \
libxkbcommon0 \
libxrender1 \
locales \
locate \
nano \
network-manager \
openssh-server \
openssl \
python \
python3 \
python3-pip \
sudo \
v4l-utils \
software-properties-common
# We are required to provide libffi6
wget http://ftp.de.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-9_arm64.deb
dpkg --install libffi6_3.2.1-9_arm64.deb
# This has no installation candidate
wget http://ports.ubuntu.com/pool/universe/g/gst-plugins-bad1.0/libgstreamer-plugins-bad1.0-0_1.14.0-1ubuntu1_arm64.deb
dpkg --install libgstreamer-plugins-bad1.0-0_1.14.0-1ubuntu1_arm64.deb
# add docker gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
# #Install multimedia packages
# wget https://repo.download.nvidia.com/jetson/t210/pool/main/n/nvidia-l4t-multimedia/nvidia-l4t-multimedia_32.6.1-20210916211029_arm64.deb
# dpkg --install nvidia-l4t-multimedia/nvidia-l4t-multimedia_32.6.1-20210916211029_arm64.deb
# #Install gstreamer_32
# wget https://repo.download.nvidia.com/jetson/t210/pool/main/n/nvidia-l4t-gstreamer/nvidia-l4t-gstreamer_32.6.1-20210916211029_arm64.deb
# dpkg --install nvidia-l4t-gstreamer_32.6.1-20210916211029_arm64.deb
# add docker repo and install
add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt-get update
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io
# add user to docker group
usermod -aG docker careray
systemctl set-default multi-user.target
另外,在change root的时候可能会出现失败的情况,重启即可。