代码编织梦想

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

参考

狗熊王的系列博客一步一步制作yaffs/yaffs2根文件系统
Xilinx Wiki Build and Modify a Rootfs
chroot,pivot_root和switch_root 区别
pivot_root(8) - Linux man page
initrd和initramfs及根文件系统切换
linux grub 引导启动过程详解
基于嵌入式Linux平台的最小文件系统的制作

busybox

在xilinx的SOC FPGA平台zynq(arm)上做验证。基于petalinux2015.2.1的根文件系统无法定制busybox,比如ls不支持2GB以上的大文件,需要手动重新制作并覆盖原来的一部分命令。

root@zynq:~# busybox --help
BusyBox v1.23.1 (2015-08-17 18:17:40 IST) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2012.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
   or: busybox --list
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, [[, addgroup, adduser, ar, ash, awk, basename, cat, chattr, chgrp,
        chmod, chown, chroot, chvt, clear, cmp, cp, cpio, cut, date, dc, dd,
        deallocvt, delgroup, deluser, depmod, devmem, df, diff, dirname, dmesg,
        dnsdomainname, du, dumpkmap, dumpleases, echo, egrep, env, expr, false,
        fatattr, fbset, fdisk, fgrep, find, flock, free, fsck, fstrim, ftpd,
        ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt,
        hd, head, hexdump, hostname, httpd, hwclock, id, ifconfig, ifdown,
        ifup, inetd, insmod, ip, kill, killall, klogd, less, ln, loadfont,
        loadkmap, logger, logname, logread, losetup, ls, lsmod, md5sum, mdev,
        mesg, microcom, mkdir, mkdosfs, mkfifo, mkfs.vfat, mknod, mkswap,
        mktemp, modprobe, more, mount, mv, netstat, nice, nohup, nslookup, od,
        openvt, patch, pidof, pivot_root, poweroff, printf, ps, pwd, rdate,
        readlink, realpath, reboot, renice, reset, rm, rmdir, rmmod, route,
        run-parts, sed, seq, setconsole, sh, sha1sum, sha256sum, sha3sum,
        sha512sum, shuf, sleep, sort, start-stop-daemon, stat, strings, stty,
        sulogin, swapoff, swapon, switch_root, sync, sysctl, syslogd, tail,
        tar, tee, telnet, telnetd, test, tftp, time, top, touch, tr, true, tty,
        udhcpc, udhcpd, umount, uname, uniq, unlink, unzip, uptime, users,
        usleep, vi, watch, watchdog, wc, wget, which, who, whoami, xargs, yes,
        zcat

解压busybox,

zc@ubuntu:~/xilinx/app$ tar -jxvf busybox-1.28.3.tar.bz2

这里写图片描述
编译busybox,

zc@ubuntu:~/xilinx/app/busybox-1.28.3$ make menuconfig

这里写图片描述

  1. Settings>build options 设置CROSS_COMPILE zynq是arm-linux-gnueabihf-,zynqMP是aarch64-linux-gnu-老版本的编译器zynq为arm-xilinx-linux-gnueabi-
  2. Settings>install options 设置安装路径 /home/zc/xilinx/rootfs/arm64 此处必须是绝对路径
  3. [*] Fancy shell prompts <—要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h \W]#”
  4. [*]vi-style line editing commands网上查资料大家都选了,目前不知为什么,估计是bash输入命令相关的
zc@ubuntu:~/xilinx/app/busybox-1.28.3$ cp .config zynqMP.config
zc@ubuntu:~/xilinx/app/busybox-1.28.3$ mkdir ~/xilinx/rootfs
zc@ubuntu:~/xilinx/app/busybox-1.28.3$ mkdir ~/xilinx/rootfs/arm64

现在准备工作完成,开始编译,执行,

zc@ubuntu:~/xilinx/app/busybox-1.28.3$ make
zc@ubuntu:~/xilinx/app/busybox-1.28.3$ make install

在配置的安装路径下生成busybox安装文件,
这里写图片描述
可以看到,现在只有四个文件夹,一个完备的根文件系统不止这些,下面加入lib文件夹,lib下的glibc库可以从工具链的安装目录下找到,

zc@ubuntu:~/program/petalinux-v2017.4-final/tools/linux-i386/aarch64-linux-gnu/aarch64-linux-gnu/libc/lib$ ls -l

这里写图片描述
复制库文件,必须的就是这几种,减小文件系统大小,使用ldd或者arm-linux-readelf -a hello2 | grep "Shared"查看应用程序需要的动态链接库,按需再添加,

mkdir arm64/lib
cp -v -a $rootfsarm64lib/ld* arm64/lib
cp -v -a $rootfsarm64lib/libdl* arm64/lib
cp -v -a $rootfsarm64lib/libm-* arm64/lib
cp -v -a $rootfsarm64lib/libpthread* arm64/lib

添加libgcc_s.so.1,否则无法使用pthread_cancel

libgcc_s.so.1 must be installed for pthread_cancel to work
zynqmp:
cp -avf ~/program/petalinux-v2018.2-final/tools/linux-i386/aarch64-linux-gnu/aarch64-linux-gnu/lib64/libgcc* ~/program/fdk/bsp/zynqmp/package-v2018.2/libso/
zynq:
cp -avf ~/program/petalinux-v2015.2.1-final/tools/linux-i386/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi/libc/lib/libgcc* ~/program/fdk/bsp/zynq/package-v2015.2.1/libso/
t2080:
cp ~/program/QorIQ-SDK-V2.0-20160527-yocto/fsl-qoriq/2.0/ppc64/sysroots/ppc64e6500-fsl-linux/lib64/libgcc* ~/program/fdk/bsp/t2080/package-v2.0/libso/

接下来我们构建etc目录,etc目录详解,etc不是什么缩写,是and so on的意思,来源于法语的et cetera,翻译成中文就是等等的意思。至于为什么在/etc下面存放配置文件, 按照原始的UNIX的说法(Linux文件结构参考UNIX的教学实现MINIX) 这下面放的都是一堆零零碎碎的东西,就叫etc,这其实是个历史遗留。

mkdir arm64/etc

etc目录比较复杂参考12
构建剩余目录

mkdir arm64/proc arm64/mnt arm64/tmp arm64/sys arm64/root arm64/home

打包根文件系统镜像

Petalinux也即yocto得到的是cpio.gz跟文件系统,打算将其部署在emmc中,所以需要制作ext4的镜像,首先解压cpio.gz根文件系统,可以自己添加新文件,

zc@ubuntu:~/xilinx/image/mwm178$ mkdir rootfs
zc@ubuntu:~/xilinx/image/mwm178$ gunzip -c rootfs.cpio.gz | sh -c 'cd rootfs/ && cpio -i'
25132 blocks
zc@ubuntu:~/xilinx/image/mwm178/rootfs$ cp ../image.ub boot/
zc@ubuntu:~/xilinx/image/mwm178/rootfs$ ls -l
total 60
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 bin
drwxr-xr-x  2 zc zc 4096 Jul  3 21:00 boot
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 dev
drwxr-xr-x 22 zc zc 4096 Jul  3 20:58 etc
drwxr-xr-x  3 zc zc 4096 Jul  3 20:58 home
lrwxrwxrwx  1 zc zc   10 Jul  3 20:58 init -> /sbin/init
drwxr-xr-x  4 zc zc 4096 Jul  3 20:58 lib
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 media
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 mnt
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 proc
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 run
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 sbin
drwxr-xr-x  2 zc zc 4096 Jul  3 20:58 sys
drwxrwxrwt  2 zc zc 4096 Jul  3 20:58 tmp
drwxr-xr-x 10 zc zc 4096 Jul  3 20:58 usr
drwxr-xr-x  7 zc zc 4096 Jul  3 20:58 var                          
zc@ubuntu:~/xilinx/image/mwm178/rootfs$ cd ..

重新打包cpio.gz的命令,

zc@ubuntu:~/xilinx/image/mwm178$ sh -c 'cd rootfs/ && find . | cpio -H newc -o' | gzip -9 > new_rootfs.cpio.gz
73524 blocks

打包成ext4的命令,

zc@ubuntu:~/xilinx/image/mwm178$ dd if=/dev/zero of=rootfs.ext4 bs=4K count=1572864
1572864+0 records in
1572864+0 records out
6442450944 bytes (6.4 GB, 6.0 GiB) copied, 32.7655 s, 197 MB/s 
zc@ubuntu:~/xilinx/image/mwm178$ mkfs.ext4 -F rootfs.ext4 
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done                            
Creating filesystem with 1572864 4k blocks and 393216 inodes
Filesystem UUID: 115ac8d2-7423-4df5-b455-133abf62f1ce
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

zc@ubuntu:~/xilinx/image/mwm178$ mkdir rootfs_ext4
zc@ubuntu:~/xilinx/image/mwm178$ sudo mount rootfs.ext4 ./rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ sudo chmod a+w rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ cp -arf rootfs/* rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ ls -l rootfs_ext4/
total 76
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 bin
drwxr-xr-x  2 zc   zc    4096 Jul  3 21:00 boot
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 dev
drwxr-xr-x 22 zc   zc    4096 Jul  3 20:58 etc
drwxr-xr-x  3 zc   zc    4096 Jul  3 20:58 home
lrwxrwxrwx  1 zc   zc      10 Jul  3 20:58 init -> /sbin/init
drwxr-xr-x  4 zc   zc    4096 Jul  3 20:58 lib
drwx------  2 root root 16384 Jul  3 21:36 lost+found
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 media
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 mnt
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 proc
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 run
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 sbin
drwxr-xr-x  2 zc   zc    4096 Jul  3 20:58 sys
drwxrwxrwt  2 zc   zc    4096 Jul  3 20:58 tmp
drwxr-xr-x 10 zc   zc    4096 Jul  3 20:58 usr
drwxr-xr-x  7 zc   zc    4096 Jul  3 20:58 var
zc@ubuntu:~/xilinx/image/mwm178$ sudo chmod a-w rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ sudo umount rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ ls rootfs_ext4/
zc@ubuntu:~/xilinx/image/mwm178$ ls -l
total 243436
-rwxrwxr-x  1 zc zc        523 Jul  2 00:59 build.sh
-rw-rw-r--  1 zc zc       1423 Jul  2 01:16 fitImage.its
-rw-r--r--  1 zc zc   18915840 Jul  2 05:12 Image
-rw-rw-r--  1 zc zc   24776492 Jul  2 05:14 image.ub
-rw-rw-r--  1 zc zc      27319 Jul  1 23:29 plnx_aarch64-system.dtb
-rw-r--r--  1 zc zc      34575 Jul  2 00:58 plnx_aarch64-system.dts
-rw-rw-r--  1 zc zc      26619 Jul  2 01:09 plnx_aarch64-system-ps-only.dtb
-rw-r--r--  1 zc zc      33492 Jul  2 01:08 plnx_aarch64-system-ps-only.dts
drwxrwxr-x 17 zc zc       4096 Jul  3 21:00 rootfs
-rw-r--r--  1 zc zc    5804313 Jul  2 01:07 rootfs.cpio.gz
drwxrwxr-x  2 zc zc       4096 Jul  3 21:37 rootfs_ext4
-rw-rw-r--  1 zc zc 6442450944 Jul  3 21:47 rootfs.ext4
-rw-rw-r--  1 zc zc   23617775 Jul  3 21:06 rootfs-image.cpio.gz
zc@ubuntu:~/xilinx/image/mwm178$ gzip -9 rootfs.ext4 
zc@ubuntu:~/xilinx/image/mwm178$ ls -l
total 100776
-rwxrwxr-x  1 zc zc      523 Jul  2 00:59 build.sh
-rw-rw-r--  1 zc zc     1423 Jul  2 01:16 fitImage.its
-rw-r--r--  1 zc zc 18915840 Jul  2 05:12 Image
-rw-rw-r--  1 zc zc 24776492 Jul  2 05:14 image.ub
-rw-rw-r--  1 zc zc    27319 Jul  1 23:29 plnx_aarch64-system.dtb
-rw-r--r--  1 zc zc    34575 Jul  2 00:58 plnx_aarch64-system.dts
-rw-rw-r--  1 zc zc    26619 Jul  2 01:09 plnx_aarch64-system-ps-only.dtb
-rw-r--r--  1 zc zc    33492 Jul  2 01:08 plnx_aarch64-system-ps-only.dts
drwxrwxr-x 17 zc zc     4096 Jul  3 21:00 rootfs
-rw-r--r--  1 zc zc  5804313 Jul  2 01:07 rootfs.cpio.gz
drwxrwxr-x  2 zc zc     4096 Jul  3 21:37 rootfs_ext4
-rw-rw-r--  1 zc zc 29920634 Jul  3 21:47 rootfs.ext4.gz
-rw-rw-r--  1 zc zc 23617775 Jul  3 21:06 rootfs-image.cpio.gz

压缩完之后只有30MB,解压命令,

zc@ubuntu:~/xilinx/image/mwm178$ gzip -d rootfs.ext4.gz 
zc@ubuntu:~/xilinx/image/mwm178$ gzip -v9 rootfs.ext4
转载请关注我的-公众号-青儿创客基地-QQ技术交流群852283276
本文链接:https://blog.csdn.net/Zhu_Zhu_2009/article/details/80378690

zynq 7000系列arm上移植linux系统后根文件系统的修改_zxczyx的博客-爱代码爱编程_zynq文件系统移植

        Zynq 7000系列的FPGA,已经不再是单纯的FPGA,而是强大的SoC。Zynq上集成了双硬核ARM9,ARM9上可以移植很多的系统,比如最常见的linux,VxWorks,Android等。这里以移植了linux系统为例,说说怎么修改linux系统的根文件系统。         在成功的移植了linux系统之后,会有一个根文件系统

zynq soc嵌入式开发(一):配置sd卡作为根文件系统_惟有饮者留其名的博客-爱代码爱编程_zynq使用什么格式的根文件系统

本文介绍了在利用PetaLinux工具为ZYNQ SoC定制Linux系统时,如何构建挂载在SD卡上的根文件系统。一手资料参考自ug1144。 petalinux默认工程下的Linux使用的rootfs是INITRAMFS

zynq7020 busybox创建自己的文件系统_smile_5me的博客-爱代码爱编程

下载busybox:git clone git://git.busybox.net/busybox 1、先清除编译出来的文件及配置文件:make distclean 2、配置busybox 保存退出后,执行make编译 3、执行make install ,会把文件系统生成在busybox源码根目录下的_install目录 4、把交叉编译器里的

petalinux 2018.2 在ubuntu 16 下的工程制作并启动实验_leon_zeng0的博客-爱代码爱编程

在上文中介绍了如何安装petalinux 2018.2。其验证的方法是: source /home/liwenz/petalinux/settings.sh 如果不报错,并且echo $PETALINUX 能显示你的安装路径就是好了。其中/home/liwenz/petalinux 是我的安装目录。 本文在此基础上创建一个工程,并用sd卡启动测试。

zynq-7000移植——根文件系统ramdisk扩容教程-爱代码爱编程

参考文章:http://xilinx.eetrend.com/d6-xilinx/blog/2017-09/12036.html 前言 由于zynq 7000系列 自带的文件系统(ramdisk)大小为16M的,而我现在

petalinux制作linux系统_有崖的博客-爱代码爱编程

版本 PETALINUX_VER=2017.4 这里引用的u-boot,kernel,busybox版本分别是: u-boot : U-Boot 2017.01 kernel : 4.9.0-xilinx-v2017.4 busybox : BusyBox v1.24.1   安装 1.安装必要的库 sudo apt-get instal

jffs2根文件系统制作_wuyujun's blog的博客-爱代码爱编程_jffs2

一.根文件系统简介   根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如inittab、rcS)和服务加载到内存中去运行。 文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上却没有烧录文件系统,是没有办法真正的启动Linux操作

根文件系统初见-爱代码爱编程

当Linux内核启动时,必须找到并执行第一个用户程序,通常是init,这就是根文件系统。对于根文件系统工作上用的比较多,基于内存和flash的都实现编译、裁剪和加载启动验证过,自认为对这一块还是比较深刻。但是没有深入的去看一下里面的原理,都是基于网上的一些常用的使用方法,稍微有点非常规的用法,出现问题了,就蒙了,原来还可以这样,有一种豁然开朗的感觉。本文档

ZYNQ_LINUX的根文件系统设置为QSPI_FLASH,JFFS2。-爱代码爱编程

目录 一、问题二、解决办法1.创建工程2.配置参数3.编译3.打包4.下载三、附录(开机启动信息) 一、问题 看下面这个链接,出现的问题和我一样。 当把根文件系统设置为 INITRAMFS 是好的,改为JFFS2就有问题。 https://forums.xilinx.com/t5/Embedded-Linux/Modify

freescale QorIQ P1020嵌入式开发流程总结-爱代码爱编程

​ 虽然嵌入式开发流程都大致一样,但是不同公司、不同的芯片开发流程总是还有差异的。 ​ 之前一直在做ARM的嵌入式开发,一开始上手powerpc总是有些担心,但是上手之后,发现其实和ARM差不多,只不过资料是真的少,可交流的人也不多。 ​ 通过大概2个月的摸索,从刚开始的烧录程序都不会,到现在总算把linux跑起来,遇到不少坑,总结一下。 裸机开发环

petalinux zynqMP配置小结-爱代码爱编程

1.DTG Settings 使用评估板或者自行设计的开发板需要更改的地方小结: 1.启动方式:flash启动或者SD启动,配置使用emmc0或者是emmc1作为启动SD; 2.配置串口0或者串口1; 3.在DTG Settings中配置其MACHINE_NAME: 依据: 这一项不配置有时候也没问题,但是有时候就会出现莫名其妙的启动问题,BOOT过程中

zynq的initramfs根文件系统-爱代码爱编程

采用initramfs方式,把内核和根文件系统合并编译在一起。内核版本:linux-xlnx-xilinx-v2015.3.zip 在linux启动的时候出现如下错误:   Warning: unable to open an initial console. VFS: Cannot open root device "null" or unkno

Petalinux工程配置详情-爱代码爱编程

Petalinux工程配置详情 前言一、字符图形化配置界面的操作方法1.界面划分:2.按钮功能:3.快捷键:二、字符图形化配置界面中的三种配置项1.启用/禁用配置项2.多选一配置项3.可编辑的配置项三、petalinux工程配置项介绍总结 前言 这章内容有关于Petalinux的配置,大概了解就行,以后会有更详细的说明。 一、字符

linux文件系统xilinx,基于zynq的Linux根文件系统生成-爱代码爱编程

Linux中Root Filesystem(根文件系统)是必不可少的,常用的是BusyBox,本节就介绍一下使用BusyBox制作Linux根文件系统rootfs,主要参考xilinx wiki上Zynq Root FileSystem CreaTIon方法: 1. 准备工作: 首先在Ubuntu中建立ARM GNU交叉编译环境,笔者使用的是Ubu

【ZYNQ搭建系统】第3篇:如何有效修改根文件系统-爱代码爱编程

uramdisk.image.gz是Linux的根文件系统,但是我们通常在板子上启动系统后,如果在这个文件系统上做任何的修改(改文件内容、改系统配置、增删项目等等),这些操作都只在当前上电周期内有效,也就是重启板子后发现之前做的修改全部复原了。这里我猜测可能我们在开发板上改的只是文件系统映像,并没有直接修改到实体上。真正的原因在制作根文件系统相关资料上应