• Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs


    目录

    关于 Debian rootfs

    Debian 没有像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 但是 Debian 提供了一个制作 rootfs 的工具 debootstrap. 以下介绍使用 debootstrap 制作 Debian rootfs 的过程.

    debootstrap 初始化一阶段

    安装 debootstrap

    sudo apt install debootstrap

    准备一个工作目录, 例如 workroot, 初始化. 注意一定要加 mirror, 否则会非常慢

    sudo debootstrap --arch=arm64 --foreign buster workroot/ http://mirrors.ustc.edu.cn/debian/

    复制 qemu-aarch64-static 到目标系统, 如果没有的话要先安装一下sudo apt install qemu-user-static

    sudo cp /usr/bin/qemu-aarch64-static workroot/usr/bin/

    检查一下是否能正常执行

    sudo chroot workroot/ /usr/bin/qemu-aarch64-static /bin/ls

    准备 resolv.conf

    echo "nameserver 127.0.0.53" | sudo tee workroot/etc/resolv.conf

    debootstrap 初始化二阶段

    chroot 到目标系统下

    sudo chroot workroot/

    第二阶段的初始化

    /debootstrap/debootstrap --second-stage http://mirrors.ustc.edu.cn/debian/

    初始化成功的话, 能看到I: Base system installed successfully

    安装设置

    安装基础软件

    添加 Debian apt source

    cat < /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

    检查是否正确

    cat /etc/apt/sources.list

    最后执行 apt update 更新, apt upgrade 升级

    安装一些基础软件, 这一步之后系统大小为 434M

    apt install locales dialog

    配置 locales, 选择 en_US.UTF-8 UTF-8, en_US.UTF-8

    dpkg-reconfigure locales

    继续安装一些软件

    apt install vim-tiny openssh-server sudo ifupdown net-tools udev iputils-ping sysstat smartmontools

    添加驱动文件

    仅使用kernel自带的驱动可以启动rootfs, 但是一些板载的外设, 例如SATA硬盘和USB, 会因为没有驱动而无法识别. 需要手动将这些驱动放到rootfs中.

    通过uname -r可以看到目标系统的架构为4.4.35-hi3798mv2x, 由此可以确定驱动的路径为

    /lib/modules/4.4.35-hi3798mv2x/

    将系统中这部分文件提取后放到rootfs的对应目录下, 结构类似于

    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

    基础设置

    设置主机名

    echo n2ns1 > /etc/hostname

    设置网络

    cat << EOT > /etc/network/interfaces.d/10-eth0
    # 依次输入
    auto eth0
    iface eth0 inet dhcp
    EOT

    设置 vim

    nano /etc/vim/vimrc.tiny
    # 修改compatible为nocompatible
    set nocompatible
    # 增加这行修复backspace键
    set backspace=2

    重要 给 root 用户设置密码, 否则刷完没法登录

    passwd

    开启 root 用户 ssh 访问, 编辑 /etc/ssh/sshd_config, 找到

    #PermitRootLogin prohibit-password

    替换为

    PermitRootLogin yes

    配置登录的串口, 修改文件 /etc/systemd/system/getty.target.wants/getty@tty1.service

    vi /etc/systemd/system/getty.target.wants/getty\@tty1.service

    ConditionPathExists=/dev/tty0

    修改为实际的名称

    ConditionPathExists=/dev/ttyAMA0

    添加欢迎界面, 新建 /etc/update-motd.d/60-welcome, 内容如下, 属性设为可执行

    #!/bin/sh
    #
    IP=$(ifconfig eth0 | grep '\'| 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}')
    "

    文件清理

    安装完成后, 清理apt

    apt autoremove
    apt autoclean
    apt clean

    最后exit退出

    制作 rootfs 镜像文件

    # 生成一个适当大小的空镜像,这个大小参考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

    参考

  • 相关阅读:
    java毕业设计校园二手书交易平台源码+lw文档+mybatis+系统+mysql数据库+调试
    bootstrap.xml 和applicaiton.properties和applicaiton.yml的区别和联系
    redis常用命令
    APP产品经理的职责(合集)
    CompletableFuture异步回调
    java毕业设计宠物领养饲养交流管理平台Mybatis+系统+数据库+调试部署
    Java NIO Selector 的使用
    Flink学习20:算子介绍reduce
    国科大图数据管理与分析课程项目gStore实验报告
    缓存雪崩导致的危害和解决办法
  • 原文地址:https://www.cnblogs.com/milton/p/17607702.html