我是靠谱客的博主 自信小虾米,最近开发中收集的这篇文章主要介绍给SAM9X60安装Debian系统给SAM9X60安装Debian系统,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

给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(试译)

最后

以上就是自信小虾米为你收集整理的给SAM9X60安装Debian系统给SAM9X60安装Debian系统的全部内容,希望文章能够帮你解决给SAM9X60安装Debian系统给SAM9X60安装Debian系统所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部