|
https://blog.csdn.net/weixin_43649647/article/details/123868495
https://www.cnblogs.com/milton/p/12074890.html
参考这两篇文章可以自己在ubuntu下制作和修改img文件内容
在ubuntu下,制作img文件
第一步,使用touch命令创建img文件
第二步,使用truncate命令修改文件尺寸,比如将img文件指定为8GB(8192*1024*1024=8,589,934,592)
- truncate --size=8589934592 sd.img
复制代码
第三步,使用losetup命令挂载img文件为虚拟硬盘
- sudo losetup --show -f sd.img
- /dev/loop14
复制代码
/dev/loop14这个是终端自动弹出的,不同设备不一定一致,后面的所有/dev/loop13都要改成自己终端显示的
第四步,使用fdisk对镜像进行分区
- fpgaer@ubuntu:$ sudo fdisk /dev/loop14
- Welcome to fdisk (util-linux 2.34).
- Changes will remain in memory only, until you decide to write them.
- Be careful before using the write command.
- Device does not contain a recognized partition table.
- Created a new DOS disklabel with disk identifier 0xfb8adc85.
- Command (m for help):
复制代码
输入p可查看该分区的大小:
- Command (m for help): p
- Disk /dev/loop14: 8 GiB, 8589934592 bytes, 16777216 sectors
- Units: sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disklabel type: dos
- Disk identifier: 0xfb8adc85
复制代码
1.2.创建a2主分区
主分区存放的是预加载程序映像。每个预加载程序映像(在预加载程序部分生成)将包含四个冗余的64KB预加载程序映像(以防闪存损坏),因此该分区至少需要256KB。
输入n,开始创建分区,然后输入p将该分区设为主分区,分区号设为3,然后启动地址为默认直接回车(MBR占用1M空间,所以起始空间为2048bit),结束地址处,输入+1M,即创建该分区为1MB。
- Command (m for help): p
- Disk /dev/loop14: 8 GiB, 8589934592 bytes, 16777216 sectors
- Units: sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disklabel type: dos
- Disk identifier: 0xfb8adc85
- Command (m for help): ^C
- Do you really want to quit? n
- Command (m for help): n
- Partition type
- p primary (0 primary, 0 extended, 4 free)
- e extended (container for logical partitions)
- Select (default p): p
- Partition number (1-4, default 1): 3
- First sector (2048-16777215, default 2048):
- Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-16777215, default 16777215): +1M
- Created a new partition 3 of type 'Linux' and of size 1 MiB.
复制代码
默认情况下,fdisk用“Linux”类型创建每个分区。我们需要再进行设置一下,改为a2类型。输入t进行修改,然后输入a2 进行设置,因为a2是altera的专属设置,因此idisk识别不了,即显示unknown。
- Command (m for help): t
- Selected partition 3
- Hex code (type L to list all codes): a2
- Changed type of partition 'Linux' to 'unknown'.
复制代码
1.3.创建根文件系统分区
此时,Master Boot Record(MBR)和A2分区将用完2mb。现在,我们将为根文件系统添加6G(6144MB)的分区。将分区2创建为6144MB的主分区,默认起始扇区为4096。
- Command (m for help): n
- Partition type
- p primary (1 primary, 0 extended, 3 free)
- e extended (container for logical partitions)
- Select (default p): p
- Partition number (1,2,4, default 1): 2
- First sector (4096-16777215, default 4096):
- Last sector, +/-sectors or +/-size{K,M,G,T,P} (4096-16777215, default 16777215): +6144M
- Created a new partition 2 of type 'Linux' and of size 6 GiB.
复制代码
默认情况下,fdisk实用程序将分区类型设置为“Linux ”,因此我们不需要更改根文件系统的分区类型(我们仍然需要在以后实际创建文件系统)。
1.4.创建FAT分区
FAT分区存放boot文件。该分区为主分区,为1号分区位置。
- Command (m for help): n
- Partition type
- p primary (2 primary, 0 extended, 2 free)
- e extended (container for logical partitions)
- Select (default p): p
- Partition number (1,4, default 1): 1
- First sector (12587008-16777215, default 12587008):
- Last sector, +/-sectors or +/-size{K,M,G,T,P} (12587008-16777215, default 16777215):
- Created a new partition 1 of type 'Linux' and of size 2 GiB.
复制代码
将分区1更改为FAT分区(这不会创建文件系统,只是通知读取SD卡的设备在这个分区上将有一个FAT文件系统)。
- Command (m for help): t
- Partition number (1-3, default 3): 1
- Hex code (type L to list all codes): b
- Changed type of partition 'Linux' to 'W95 FAT32'.
复制代码
1.5.验证及保存
打印出分区表,并验证它如下所示。
- Command (m for help): p
- Disk /dev/loop14: 8 GiB, 8589934592 bytes, 16777216 sectors
- Units: sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disklabel type: dos
- Disk identifier: 0x39343cdb
- Device Boot Start End Sectors Size Id Type
- /dev/loop14p1 12587008 16777215 4190208 2G b W95 FAT32
- /dev/loop14p2 4096 12587007 12582912 6G 83 Linux
- /dev/loop14p3 2048 4095 2048 1M a2 unknown
- Partition table entries are not in disk order.
- Command (m for help): w
- The partition table has been altered.
- Calling ioctl() to re-read partition table.
- Re-reading the partition table failed.: Invalid argument
- The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
复制代码
最后输入如下指令告诉内核进行更新,否则内核找不到刚才设立的分区。
- sudo partprobe /dev/loop14
复制代码
ubuntu下更新preloader.img文件到sd卡的A2分区命令
- sudo dd if=preloader.img of=/dev/loop14p3 bs=64k seek=0
复制代码
其中loop14p3 是ubuntu下挂载img文件后的A2分区名称,如果是实体SD卡,则可能是sdb3、sdc3,具体实体卡名是什么,可以通过sudo fdisk -l查看
bs是块大小,这里以64k是因为preloader.img文件尺寸为固定64K
ubuntu下更新u-boot.img文件到sd卡的A2分区命令
- sudo dd if=u-boot.img of=/dev/loop14p3 bs=64k seek=4
复制代码
其中loop14p3 是ubuntu下挂载img文件后的A2分区名称,如果是实体SD卡,则可能是sdb3、sdc3,具体实体卡名是什么,可以通过sudo fdisk -l查看
bs是块大小,这里以64k是因为A2分区前面存放了4个冗余的64K容量的preloader。然后seek为4,意思就是从A2分区开头,跳过64K *4=256K的空间,再写入。
2.2.创建FAT文件系统与ext4文件系统
在分区1(我们设置为“FAT”类型的分区)上创建FAT文件系统。
- sudo mkfs -t vfat /dev/loop14p1
复制代码
终端输入如下,在分区2创建ext4文件系统。也就是后面的根文件系统
- udo mkfs.ext4 /dev/loop14p2
- mke2fs 1.45.5 (07-Jan-2020)
- Discarding device blocks: done
- Creating filesystem with 1572864 4k blocks and 393216 inodes
- Filesystem UUID: 88309e43-7e1e-4838-a9aa-c7e56a6a8ef2
- Superblock backups stored on blocks:
- 32768, 98304, 163840, 229376, 294912, 819200, 884736
- Allocating group tables: done
- Writing inode tables: done
- Creating journal (16384 blocks): done
- Writing superblocks and filesystem accounting information: done
复制代码
此时Ubuntu系统可能会自己自动挂载已经识别的fat和ext4分区到系统,可以在图形界面下看到了
用cp命令将fat分区下需要的文件(提前准备好)u-boot.img、u-boot.scr、soc_system.dtb、soc_system.rbf拷贝到fat分区下,也可以图形界面直接操作
- cp u-boot.img u-boot.scr soc_system.dtb soc_system.rbf /home/fpgaer/F5B6-A9BC
复制代码
使用sync命令同步
拷贝准备好的文件系统到ext4分区
注意:拷贝文件系统需要保持所有文件属性,若直接用cp复制,不带-p参数,会导致文件属性丢失,导致系统最终起不来。
可以使用cp -nrp命令或者rsync命令完成文件带属性的拷贝
- rsync [选项] 源文件或目录 目标文件或目录
复制代码
例如,将本地目录/local/dir/同步到远程服务器的/remote/dir/:
- rsync -avz /local/dir/ user@remotehost:/remote/dir/
复制代码
使用cp命令
- cp -rp /data/project/ /backup/project/
复制代码
完事后,卸载镜像
- sudo losetup -d /dev/loop14
复制代码
插入sd卡,使用dd命令将img文件烧入sd卡中
- sudo dd if=sd.img of=/dev/sdc bs=2048
复制代码
|
|