[PIC32/SAM]

给SAM9X60安装Debian系统

[复制链接]
109|0
手机看帖
扫描二维码
随时随地手机跟帖
CoolSilicon|  楼主 | 2023-3-14 21:30 | 显示全部楼层 |阅读模式
本帖最后由 CoolSilicon 于 2023-3-14 21:33 编辑

给SAM9X60安装Debian系统
刚好手上有一块SAM9X60的评估板,于是参考@人生长恨水的教程制作了Debian 10(Buster)的根文件系统,并且成功运行于SAM9X60_EK板子上。

一. 制作ARM架构根文件系统
运行环境
通过vm虚拟机安装的虚拟环境Linux, 我使用Ubuntu 20.04,如何安装网上一搜就有了,按照步骤安装即可。
编译机:Ubuntu 20.04-desktop-amd64

下载文件系统
能用普通用户执行的,不要用root用户来执行,等需要用到root用户时再切换。
安装以下依赖,有效防止报错
Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg

$ sudo apt install debian-archive-keyring

安装所需依赖,使用debootstrap命令创建文件系统。

$ cd ~/build
# 安装必要依赖 debootstrap就是构建的命令
$ sudo apt install qemu qemu-user-static binfmt-support debootstrap

# 构建文件系统的命令
$ sudo debootstrap --arch=armel --foreign buster linux-rootfs http://ftp.cn.debian.org/debian/

# qemu-arm-static是其中的关键,能在 x86_64 主机系统下 chroot 到 arm 文件系统
$ sudo cp -a /usr/bin/qemu-arm-static ~/build/linux-rootfs/usr/bin/qemu-arm-static

–arch:指定制作的文件系统是什么架构的, 此处是armel
–foreign:在与主机架构不相同时需要指定此参数,仅做初始化的解包
buster:这个是Debian 10的发行版本号,此版本支持的硬件最低要求是ARMv5T, SAM9X60使用的内核ARM926EJ-S正好是这个版本。
linux-rootfs:这个是要存放文件系统的文件夹,可以不用先创建,执行上述命令会自动创建此文件夹,也可以先创建。
http://ftp.cn.debian.org/debian/ :这个是中国镜像服务器地址。Debian 全球镜像站https://www.debian.org/mirror/list
接下来我们可以通过chroot进入到制作好的文件系统。
这里提供一个脚本文件来进入我们的根文件系统,最好不要使用root用户执行此脚本。
ch-mount.sh: https://github.com/ywhs/rpi-arm64/blob/master/ch-mount.sh

# 此脚本有两个参数  -u 是取消挂载  -m 是挂载,为什么要挂载本机的设备文件,我也不太清楚
$ ./ch-mount.sh -m linux-rootfs/
# 执行脚本后,没有报错会进入文件系统,显示 I have no name ,这是正常的,不要慌张,我当时就有点懵逼,这是因为还没有初始化。
I have no name!@node2:/#
# 以下命令是在根文件系统中执行的命令
# 进行第二步,初始化文件系统,会把一个系统的基础包等全部初始化
$ debootstrap/debootstrap --second-stage
# 初始化好了以后,退出文件系统,再次进入后就显示root了
$ exit
# 再次进入时,不需要执行脚本,使用chroot命令即可,因为ch-mount脚本是为了挂载本机文件与文件系统的关联而已
$ sudo chroot linux-rootfs

如果脚本报错 :/bin/sh^M:bad interpreter: No such file or directory,这是因为文件格式的错误,可通过以下方式解决

$ vim ch-mount.sh
#设置文件格式为unix 然后保存退出
:set ff=unix
:wq
#或者没有权限,可以开通运行权限
$ chmod 777 ch-mount.sh

定制文件系统
上面完成后,现在在文件系统内,需要对文件系统进行一些DIY,安装一些我们必要的工具,和配置网络等等,系统为Debain 10,其他发行版请自行更换命令。

要确保进入文件系统后有网络,一般如果没有网络,可以先把 /etc/resolv.conf 文件拷贝到 linux-rootfs/etc/resolv.conf,因为我构建的文件系统会默认把本机的 resolv.conf 拷贝进去,所以我没有手动拷贝。

更换国内镜像源
#如果遇到无法拉取 https 源的情况,请先使用 http 源并安装
$ apt install apt-transport-https
$ cp /etc/apt/source.list /etc/apt/source.list_bak
#这里用的vim.tiny是构建文件系统是自带的,跟vim一样也可以编辑文件,把文件内容全部替换为以下内容
$ vim.tiny /etc/apt/source.list

#默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-updates main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-backports main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security stretch/updates main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security stretch/updates main contrib non-free


配置root用户密码
#先ping www.baidu.com 看下是否有网络,没有网络需要退出文件系统,把宿主机的reslov.conf文件拷贝到相应位置即可。
$ ping www.baidu.com
$ apt update
#先设置root用户的密码
$ passwd

创建一个普通用户
#这两个环境变量可以自行修改
$ USER=user
$ HOST=sam9x60
$ useradd -G sudo -m -s /bin/bash $USER
$ passwd $USER


设置时区和设置使能串口,打开硬件串口,可以通过USB转串口模块登录终端
#设置时区
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#使能串口,如果只是为了制作根文件系统,可以不用运行这个命令
$ ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyAMA0.service


安装一些依赖
#安装音频管理
$ apt install alsa-utils libasound2-dev
#安装 vim 和 ssh
$ apt install vim ssh
#安装网络管理工具
$ apt install ifupdown net-tools
#安装其他依赖,如果还有其他依赖需要安装可以继续向后加入
$ apt install udev sudo wget


设置主机名和以太网
$ echo $HOST > /etc/hostname
$ echo "127.0.0.1    localhost.localdomain localhost" > /etc/hosts
$ echo "127.0.0.1    $HOST" >> /etc/hosts
$ echo "auto eth0" > /etc/network/interfaces.d/eth0
$ echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0


以上全部完成后,我们的根文件系统就制作好了,退出文件系统后调用 ch-mount.sh 脚本取消挂载就好了。

$ exit
$ ./ch-mount -u linux-rootfs/


文件系统制作好了以后,就可以进入下一步。

异常处理
在使用 apt 命令安装工具时,一直有警告信息:perl: warning: Setting locale failed.

界面方式解决
$ apt-get install locales
$ dpkg-reconfigure locales
#进入界面后,向下选上 en_US.UTF-8 和 zh_CN.UTF-8 选择ok
#进入下个界面后选择默认的zh_CN.UTF-8 就可以解决了。


手动解决
#这里为什么时vim.tiny呢,是因为这个命令在文件系统中自带的,如果安装了vim的话,用vim也可以
$ apt-get install locales
#打开文件后找到 en_US.UTF-8 和 zh_CN.UTF-8 删掉 # 好  取消注释
$ vim.tiny /etc/locale.gen
$ locale.gen
#创建 /etc/locale.conf
$ vim.tiny /etc/locale.conf
LANG=zh_CN.UTF-8


二. 将kernel、uboot、rootfs打包进镜像
制作镜像文件
创建一个大小为 1000M 的根文件系统映像文件,然后对映像文件分区
经烧录后显示,1000M的话已经使用了60%,所以要是有许多要做的事情,或者上传一些东西的话,最好创建个比较大一点的映像文件
$ cd ~/build
$ fallocate -l 1000M rootfs.img
#分区
$ fdisk rootfs.img
    a.输入o。这将清除映像文件上的任何分区。
    b.键入p以列出分区。应该没有分区。
    c.键入n,然后p为primary,1表示驱动器上的第一个分区,按ENTER接受默认的第一个扇区,然后为最后一个扇区键入+ 100M。
    d.键入t,然后c将第一个分区设置为键入W95 FAT32(LBA)。
    e.键入n,然后p表示主驱动器,2表示驱动器上的第二个分区,然后按两次ENTER键接受默认的第一个和最后一个扇区。
    f.写入分区表并键入w退出。
#可通过命令查看设置好的分区
$ fdisk -l rootfs.img


使用kpartx挂载镜像到loopX
在linux中,如果映像文件(.img)含有分区表的话,使用mount是挂在不上的;可以使用kpartx挂载; X是你显示的数字,Y也是数字,每个人不一定相同,第一个 loopXpY 是上面分区后的第一个分区,第二个就是第二个分区

$ sudo apt install kpartx
$ sudo kpartx -av rootfs.img
    # add map loop8p1 (253:1): 0 204800 linear 7:8 2048
    # add map loop8p2 (253:2): 0 1841152 linear 7:8 206848
#这两个设备可以在 /dev/mapper/ 目录中看到
$ ls /dev/mapper/


格式化分区并指定分区LABEL名字
$ sudo mkfs.vfat -n BOOT /dev/mapper/loop8p1
$ sudo mkfs.ext4 -F -L ROOTFS /dev/mapper/loop8p2
#第一个命令中的-n 参数就是指定LABEL,可以通过  man mkfs.vfat 查看参数详情
#第二个命令的 -F 是强制的意思(理解的不对可以纠正我),-L 指定LABEL 同样可以通过man mkfs.ext4 查看参数详情


创建挂载点并挂载
经过格式化分区后,现在我们可以挂载loopXpY设备到文件

$ sudo mkdir {/mnt/loopXp1,/mnt/loopXp2}
$ sudo mount /dev/mapper/loop8p1 /mnt/loopXp1
$ sudo mount /dev/mapper/loop8p2 /mnt/loopXp2


复制内核和boot所需文件
boot和内核文件可以自己编译或者从已有的IMG中提取。

自己编译和官方固件请参考下面的链接:
SAM9X60EK

这里为了方便直接提取到boot文件夹中。

$ cd ~/build
#复制boot所需文件和内核:boot.bin, sam9x60ek.itb, u-boot.bin和uboot.env
$ sudo cp -r ./boot/* /mnt/loopXp1/


同步rootfs进镜像第二分区
$ sudo apt install rsync
$ cd ~/build/linux-rootfs/
#开始同步
$ sudo rsync -HPavz -q ./ /mnt/loopXp2


rsync参数详解: rsync命令

编写fstab文件
如果想要第一分区中的boot目录在系统启动后显示文件,需要在 /etc/fstab 中添加以下内容:

$ sudo vim /mnt/loopXp2/etc/fstab
<file system>   <mount point>    <type>   <options>  <dump> <pass>
LABEL=BOOT      /boot            vfat     defaults   0      1

#file system: 可以是实际分区名,也可以是实际分区的卷标(Lable),卷标名上面已经规定过了
#mount point: 是挂载点
#type: 为此分区的文件系统类型,vfat位fat32的类型应该是
#options: 是挂载的选项,用于设置挂载的参数,常见的有以下参数
#    defaults: rw, suid, dev, exec, auto, nouser, and async.
#    auto: 系统自动挂载,fstab默认就是这个选项
#    noauto 开机不自动挂载
#    nouser 只有超级用户可以挂载
#    ro 按只读权限挂载
#    rw 按可读可写权限挂载
#    user 任何用户都可以挂载
#dump: 是备份设置 当其值设置为1时,将允许dump备份程序备份;设置为0时,忽略备份操作;
#pass: 是fsck磁盘检查设置; 其值是一个顺序。当其值为0时,永远不检查;而 / 根目录分区永远都为1。其它分区从2开始,数字越小越先检查,如果两个分区的数字相同,则同时检查。

卸载烧录IMG文件
$ cd ~/build
$ sync
$ sudo umount /mnt/loopXp1/
$ sudo umount /mnt/loopXp2/
$ sudo kpartx -dv rootfs.img


把镜像烧录到SD卡中
把 rootfs.img下载到windowns下,再烧录到SD卡中。
烧录SD卡的方式可参考:SAM9X60 EK

启动SAM9X60_EK后通过命令查看内核版本

$ uname -a
# Linux sam9x60 5.15.32-linux4microchip-2022.04 #1 Tue May 10 15:03:52 CEST 2022 armv5tejl GNU/Linux


三. 参考链接
树莓派(Raspberry Pi 4 Model B)编译64位内核Kernel:树莓派(Raspberry Pi 4 Model B)编译64位内核Kernel
debootstrap 制作arm64位根文件系统:debootstrap 制作arm64位根文件系统
debootstrap(8) - Linux man page(试译):debootstrap(8) - Linux man page(试译)
————————————————
版权声明:本文为CSDN博主「FlyerInk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FlyerInk/article/details/127840799

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

1058

帖子

4

粉丝