笔记中记录的是制做Debian 9的根文件系统,可是若是你跟着作一遍,Ubuntu的系统也是能够自行制做的,无非是在构建文件系统的时候把发行版本换成Ubuntu的发行版,还有镜像服务器。html
由于我制做这个根文件系统是为了配合树莓派的,因此当前笔记只记录如何制做根文件系统,要想自定义完整的从内核开始制做到可烧录到树莓派的.img文件,可参考我另外一篇笔记 。node
经过vm虚拟机安装的虚拟环境Linux,如何安装网上一搜就有了,按照步骤安装便可linux
编译机:Ubuntu 18.04-desktop-amd64git
能用普通用户执行的,不要用root用户来执行,等须要用到root用户时再切换。github
安装如下依赖,有效防止报错bootstrap
Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpgubuntu
$ sudo apt-get install debian-archive-keyring
复制代码
安装所需依赖,使用debootstrap命令建立文件系统。建立个工做目录。vim
# 新建工做目录 build
$ mkdir ~/build && cd ~/build
# 安装必要依赖 debootstrap就是构建的命令
$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
# 切换到root
$ su
# 构建文件系统的命令
$ debootstrap --arch=arm64 --foreign stretch linux-rootfs http://ftp.cn.debian.org/debian/
# 切换到普通用户
$ su [user]
# qemu-aarch64-static是其中的关键,能在 x86_64 主机系统下 chroot 到 arm64 文件系统
$ sudo cp -a /usr/bin/qemu-aarch64-static ~/build/linux-rootfs/usr/bin/qemu-aarch64-static
复制代码
--arch:指定制做的文件系统是什么架构的bash
--foreign:在与主机架构不相同时须要指定此参数,仅作初始化的解包服务器
stretch:这个是Debian 9的发行版本号,为何没用最新的Debian 10的buster,由于更换国内的镜像源老是有点问题Debian 发行版
linux-rootfs:这个是要存放文件系统的文件夹,能够不用先建立,执行上述命令会自动建立此文件夹,也能够先建立
ftp.cn.debian.org/debian/ :这个是中国镜像服务器地址,Debian 全球镜像站
接下来咱们能够经过chroot进入到制做好的文件系统。 chroot wiki
这里提供一个脚本文件来进入咱们的根文件系统,最好不要使用root用户执行此脚本 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
复制代码
上面完成后,如今在文件系统内,须要对文件系统进行一些DIY,安装一些咱们必要的工具,和配置网络等等,系统为Debain 9,其余发行版请自行更换命令。
要确保进入文件系统后有网络,通常若是没有网络,能够先把 /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
复制代码
# 先ping www.baidu.com 看下是否有网络,没有网络须要退出文件系统,把宿主机的reslov.conf文件拷贝到相应位置便可。
$ ping www.baidu.com
$ apt-get update
# 先设置root用户的密码
$ passwd
复制代码
# 这两个环境变量能够自行修改
$ USER=pi
$ HOST=raspberry
$ useradd -G sudo -m -s /bin/bash $USER
$ passwd $USER
复制代码
# 设置时区
$ 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-get install alsa-utils libasound2-dev
# 安装 vim 和 ssh
$ apt-get install vim ssh
# 安装网络管理工具
$ apt-get install ifupdown net-tools
# 安装其余依赖,若是还有其余依赖须要安装能够继续向后加入
$ apt-get install udev sudo wget curl
复制代码
$ 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
复制代码
文件系统制做好了之后,关于用法,如今的我只知道能够打包进.img镜像文件中,其余用法请自行查阅吧。
在使用 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 就能够解决了。
# 用命令测试是否不报错
$ perl -e exit
复制代码
这里为何时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
# 用命令测试是否不报错
$ perl -e exit
复制代码