本文参考自

gun-linux.org

的文章 ,本文将实现如何通过Ubuntu-core在Aarch64上构建最小的Ubuntu文件系统。

ubuntu-base-arm64的下载地址

1 下载文件创建rootfs文件夹

  1. mkdir ~/rootfs && cd ~/rootfs
  2. wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.2-base-arm64.tar.gz
  3. mkdir ubuntu-rootfs
  4. tar -xvf ubuntu-base-16.04.2-base-arm64.tar.gz -C ubuntu-rootfs
  5. cd ubuntu-rootfs
  6. ls

查看当前路径下的文件结构已经OK

  1. bin dev home media opt root sbin srv system usr
  2. boot etc lib mnt proc run snap sys tmp var

2 安装qemu-user-static搭建arm64模拟环境

此时位于 ~/rootfs/ubuntu-rootfs/ 路径下,需要安装qemu-user-static并拷贝qemu-aarch64-static到当前路径的 usr/bin/下。

  1. apt-get install qemu-user-static
  2. cp /usr/bin/qemu-aarch64-static usr/bin
  3. cp -b /etc/resolv.conf etc/

3 chroot 到 模拟arm64的文件系统下

  1. #创建ch-mount.sh 脚本
  2. cd ../
  3. vi ch-mount.sh

将以下的内容复制到ch-mount.sh中即可。

  1. #!/bin/bash
  2. #
  3. function mnt() {
  4. echo "MOUNTING"
  5. sudo mount -t proc /proc ${2}proc
  6. sudo mount -t sysfs /sys ${2}sys
  7. sudo mount -o bind /dev ${2}dev
  8. sudo mount -o bind /dev/pts ${2}dev/pts
  9. sudo chroot ${2}
  10. }
  11. function umnt() {
  12. echo "UNMOUNTING"
  13. sudo umount ${2}proc
  14. sudo umount ${2}sys
  15. sudo umount ${2}dev/pts
  16. sudo umount ${2}dev
  17. }
  18. if [ "$1" == "-m" ] && [ -n "$2" ] ;
  19. then
  20. mnt $1 $2
  21. elif [ "$1" == "-u" ] && [ -n "$2" ];
  22. then
  23. umnt $1 $2
  24. else
  25. echo ""
  26. echo "Either 1'st, 2'nd or both parameters were missing"
  27. echo ""
  28. echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
  29. echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
  30. echo ""
  31. echo "For example: ch-mount -m /media/sdcard/"
  32. echo ""
  33. echo 1st parameter : ${1}
  34. echo 2nd parameter : ${2}
  35. fi

通过ch-mount.sh脚本chroot到arm64的文件系统下

  1. ./ch-mount.sh -m ubuntu-rootfs

4 安装基础的软件包

  1. apt-get install \
  2. language-pack-en-base \
  3. sudo \
  4. ssh \
  5. net-tools \
  6. network-manager \
  7. iputils-ping \
  8. rsyslog \
  9. bash-completion \
  10. htop \

5 系统基础的修改

添加用户、设定合适的组并设置密码

  1. useradd -s '/bin/bash' -m -G adm,sudo yourusername
  2. echo "Set password for yourusername:"
  3. passwd yourusername
  4. echo "Set password for root:"
  5. passwd root

设置主机名

  1. echo 'ubuntu.yourusername' > /etc/hostname

设置自动更新DNS

  1. dpkg-reconfigure resolvconf

配置登录的串口

因为暂时未安装桌面,所以这里的配置要具体和内核中登录的串口的设备对应起来,不然对导致无法通过串口登录的问题。

在 /etc/init/ 下添加或修改ttyS0.conf

  1. start on stopped rc or RUNLEVEL=[12345]
  2. stop on RUNLEVEL [!12345]
  3. respawn
  4. exec /sbin/getty -L 115200 ttyFIQ0 vt102

本文环境的登录串口为ttyFIQ0,具体可能会因为目标板差异而不同,具体要参考所使用的平台进行修改。

6 退出并制作可烧录的固件

退出arm64模拟文件系统

  1. exit
  2. ./ch-mount -u ubuntu-rootfs

使用dd指令制作空的固件容器

  1. dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
  2. sudo mkfs.ext4 ubuntu-rootfs.img

将arm64文件系统内容制作到ubuntu-rootfs.img

  1. mkdir ubuntu-mount
  2. sudo mount ubuntu-rootfs.img ubuntu-mount/
  3. sudo cp -rfp ubuntu-rootfs/* ubuntu-mount/
  4. sudo umount ubuntu-mount/
  5. e2fsck -p -f ubuntu-rootfs.img
  6. resize2fs -M ubuntu-rootfs.img

Finished

如何构建一个arm64 AArch64的Ubuntu rootfs的更多相关文章

  1. 使用.net core在Ubuntu构建一个TCP服务器

    介绍和背景 TCP编程是网络编程领域最有趣的部分之一.在Ubuntu环境中,我喜欢使用.NET Core进行TCP编程,并使用本机Ubuntu脚本与TCP服务器进行通信.以前,我在.NET框架本身写了 ...

  2. 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

    构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...

  3. Python-黑客-004 用Python构建一个SSH僵尸网络-02 手动与SSH交互

    用Python构建一个SSH僵尸网络-02 手动与SSH交互 - 登录SSH服务器端的 root 用户 我的电脑(攻击者)的系统:Ubuntu14.04 : 用户名: aobosir@ubuntu:~ ...

  4. Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像

    本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...

  5. [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别

    大概两三年前微软发布了一个基于Cognitive Service API的how-old.net网站,用户可以上传一张包含人脸的照片,后台通过调用深度学习算法可以预测照片中的人脸.年龄以及性别,然后将 ...

  6. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  7. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  8. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  9. 《一个操作系统的实现》 ubuntu系统环境配置

    <一个操作系统的实现> ubuntu系统环境配置 电脑之前已经安装了gcc. 一.nasm安装:sudo apt-get install nasm或官网下载http://sourcefor ...

随机推荐

  1. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  2. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  3. C++创建动态库

    [C++]创建动态库 有很多方法,这个只是其中一种 比较简洁的方法. char* __stdcall correction(char* str) char *_result = new char[se ...

  4. pytorch torchversion标准化数据

     新旧标准差的关系

  5. 数组的forEach和map和for方法的区别

    一.定义 foreach():  从头到尾遍历数组,为每个元素调用指定的函数. map():  将调用的数组的每个元素传递给指定的函数,并返回一个数组,他包含该函数的返回值. 传递的函数是 forea ...

  6. Windows挂载Gluster复制卷

    本地挂载测试 mount -t glusterfs 127.0.0.1:/gv1 /mnt [root@gluster1 mnt]# df -h Filesystem Size Used Avail ...

  7. 小白也能轻松上手的Prometheus教程

    这篇文章将承接此前关于使用Prometheus配置自定义告警规则的文章.在本文中,我们将demo安装Prometheus的过程以及配置Alertmanager,使其能够在触发告警时能发送邮件,但我们将 ...

  8. java之重载与重写

    重写(override) 重写是子类对父类的允许访问的方法的重新编写,方法名,返回值类型和形参列表都不能改变,唯一恩能够改变的是方法体. 重写的好处是可以根据子类的需要的行为来实现父类的方法. 重写方 ...

  9. 四、CentOS 6.5 上传和安装Nginx

    CentOS 6.5 上传和安装Nginx

  10. .NET Core+WebApi+EF访问数据新增用户数据

    新建一个.NET Core项目,我使用的IDE是VS2019 依次创建三个Core类库:第一个命名api.Model,第二个api.Common,第三个api.Bo 解释一下这个三类库的作用: 第一个 ...