Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
<h1 id="目录">目录</h1><ul>
<li>Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明</li>
<li>Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改</li>
<li>Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs</li>
<li>Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs</li>
</ul>
<h1 id="关于-debian-rootfs">关于 Debian rootfs</h1>
<p>Debian 没有像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 但是 Debian 提供了一个制作 rootfs 的工具 debootstrap. 以下介绍使用 debootstrap 制作 Debian rootfs 的过程.</p>
<h1 id="debootstrap-初始化一阶段">debootstrap 初始化一阶段</h1>
<p>安装 debootstrap</p>
<pre><code class="language-bash">sudo apt install debootstrap
</code></pre>
<p>准备一个工作目录, 例如 workroot, 初始化. 注意一定要加 mirror, 否则会非常慢</p>
<pre><code class="language-bash">sudo debootstrap --arch=arm64 --foreign buster workroot/ http://mirrors.ustc.edu.cn/debian/
</code></pre>
<p>复制 qemu-aarch64-static 到目标系统, 如果没有的话要先安装一下<code>sudo apt install qemu-user-static</code></p>
<pre><code class="language-bash">sudo cp /usr/bin/qemu-aarch64-static workroot/usr/bin/
</code></pre>
<p>检查一下是否能正常执行</p>
<pre><code class="language-bash">sudo chroot workroot/ /usr/bin/qemu-aarch64-static /bin/ls
</code></pre>
<p>准备 resolv.conf</p>
<pre><code class="language-bash">echo "nameserver 127.0.0.53" | sudo tee workroot/etc/resolv.conf
</code></pre>
<h1 id="debootstrap-初始化二阶段">debootstrap 初始化二阶段</h1>
<p>chroot 到目标系统下</p>
<pre><code class="language-bash">sudo chroot workroot/
</code></pre>
<p>第二阶段的初始化</p>
<pre><code class="language-bash">/debootstrap/debootstrap --second-stage http://mirrors.ustc.edu.cn/debian/
</code></pre>
<p>初始化成功的话, 能看到<code>I: Base system installed successfully</code></p>
<h1 id="安装设置">安装设置</h1>
<h2 id="安装基础软件">安装基础软件</h2>
<p>添加 Debian apt source</p>
<pre><code>cat <<EOT > /etc/apt/sources.list
# 依次输入以下内容
deb http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
EOT
</code></pre>
<p>检查是否正确</p>
<pre><code class="language-bash">cat /etc/apt/sources.list
</code></pre>
<p>最后执行 <code>apt update</code> 更新, <code>apt upgrade</code> 升级</p>
<p>安装一些基础软件, 这一步之后系统大小为 434M</p>
<pre><code class="language-bash">apt install locales dialog
</code></pre>
<p>配置 locales, 选择 en_US.UTF-8 UTF-8, en_US.UTF-8</p>
<pre><code class="language-bash">dpkg-reconfigure locales
</code></pre>
<p>继续安装一些软件</p>
<pre><code class="language-bash">apt install vim-tiny openssh-server sudo ifupdown net-tools udev iputils-ping sysstat smartmontools
</code></pre>
<h2 id="添加驱动文件">添加驱动文件</h2>
<p>仅使用kernel自带的驱动可以启动rootfs, 但是一些板载的外设, 例如SATA硬盘和USB, 会因为没有驱动而无法识别. 需要手动将这些驱动放到rootfs中.</p>
<p>通过<code>uname -r</code>可以看到目标系统的架构为<code>4.4.35-hi3798mv2x</code>, 由此可以确定驱动的路径为</p>
<pre><code>/lib/modules/4.4.35-hi3798mv2x/
</code></pre>
<p>将系统中这部分文件提取后放到rootfs的对应目录下, 结构类似于</p>
<pre><code>modules
└── 4.4.35-hi3798mv2x
├── kernel
│ ├── crypto
│ ├── drivers
│ ├── fs
│ ├── lib
│ └── net
├── modules.alias
├── modules.alias.bin
├── modules.builtin
├── modules.builtin.alias.bin
├── modules.builtin.bin
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.order
├── modules.softdep
├── modules.symbols
└── modules.symbols.bin
</code></pre>
<h2 id="基础设置">基础设置</h2>
<p>设置主机名</p>
<pre><code class="language-bash">echo n2ns1 > /etc/hostname
</code></pre>
<p>设置网络</p>
<pre><code class="language-bash">cat << EOT > /etc/network/interfaces.d/10-eth0
# 依次输入
auto eth0
iface eth0 inet dhcp
EOT
</code></pre>
<p>设置 vim</p>
<pre><code class="language-bash">nano /etc/vim/vimrc.tiny
# 修改compatible为nocompatible
set nocompatible
# 增加这行修复backspace键
set backspace=2
</code></pre>
<p><strong>重要</strong> 给 root 用户设置密码, 否则刷完没法登录</p>
<pre><code class="language-bash">passwd
</code></pre>
<p>开启 root 用户 ssh 访问, 编辑 /etc/ssh/sshd_config, 找到</p>
<pre><code>#PermitRootLogin prohibit-password
</code></pre>
<p>替换为</p>
<pre><code>PermitRootLogin yes
</code></pre>
<p>配置登录的串口, 修改文件 /etc/systemd/system/getty.target.wants/getty@tty1.service</p>
<pre><code class="language-bash">vi /etc/systemd/system/getty.target.wants/getty\@tty1.service
</code></pre>
<p>将</p>
<pre><code>ConditionPathExists=/dev/tty0
</code></pre>
<p>修改为实际的名称</p>
<pre><code>ConditionPathExists=/dev/ttyAMA0
</code></pre>
<p>添加欢迎界面, 新建 /etc/update-motd.d/60-welcome, 内容如下, 属性设为可执行</p>
<pre><code class="language-bash">#!/bin/sh
#
IP=$(ifconfig eth0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{print $2}' | awk 'NR==1')
DEVICE=$(dmesg 2> /dev/null | grep "CPU: hi3798" | awk -F ':[ ]' '/CPU/{printf ($2)}')
[ ! "$DEVICE" ] && DEVICE=$(head -n 1 /etc/regname 2> /null)
echo "
Board : ${DEVICE}
Module: $(egrep -oa "hi3798.+reg" /dev/mmcblk0p1| cut -d '_' -f1 | sort | uniq | tr "\\n" ",")
CPU : $(cat -v /proc/device-tree/compatible |sed 's/\^@//g') @ $(cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l) cores
Version : $(awk -F '[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release) | $(uname -r)-$(getconf LONG_BIT)bit
Storage : $(df -m / | grep -v File | awk '{a=$4*100.0/$2;b=$4;c=$2} {printf("%.1f%% free, %.1fMiB of %.1fMiB\n",a,b,c)}')
Memory: $(free -m | grep Mem | awk '{a=$7*100.0/$2;b=$2} {printf("%.1f%% free, %.1fMiB total\n",a,b)}') | Swap:$(free -m | grep Swap | awk '{a=$4*100/$2;b=$4} {printf("%.1f%% %.1fMiB\n",a,b)}')
Up Time : $(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=($1%60)} {printf("%d days %02d:%02d:%02d\n",a,b,c,d)}' /proc/uptime)
IP Addr : $IP
Temp : $(grep Tsensor /proc/msp/pm_cpu | awk '{print $4}')°C
MAC : $(ifconfig eth0 |grep "ether"| awk '{print $2}')
"
</code></pre>
<h2 id="文件清理">文件清理</h2>
<p>安装完成后, 清理apt</p>
<pre><code class="language-bash">apt autoremove
apt autoclean
apt clean
</code></pre>
<p>最后<code>exit</code>退出</p>
<h1 id="制作-rootfs-镜像文件">制作 rootfs 镜像文件</h1>
<pre><code class="language-bash"># 生成一个适当大小的空镜像,这个大小参考du -h workroot/ -d1
dd if=/dev/zero of=rootfs.img bs=1M count=1024
# 格式化
mkfs.ext4 rootfs.img
# or
mkfs -t ext4 rootfs.img
# 挂载空镜像
mkdir rootfs
sudo mount rootfs.img rootfs/
# 写入文件, 保留权限
sudo cp -rfp workroot/* rootfs/
# 取消挂载
sudo umount rootfs/
# 检查文件系统并自动修复
e2fsck -p -f rootfs.img
# 使镜像紧凑
resize2fs -M rootfs.img
</code></pre>
<h1 id="参考">参考</h1>
<ul>
<li>Detailed process https://akhileshmoghe.github.io/_post/linux/debian_minimal_rootfs</li>
</ul><br><br>
来源:https://www.cnblogs.com/milton/p/17607702.html
頁:
[1]