vivado-risc-v的./mk-sd-card执行输出
root@ubuntu:/home/yz/vivado-risc-v# ./mk-sd-card
make: “debian-riscv64/initrd”已是最新。
make: “debian-riscv64/rootfs.tar.gz”已是最新。
记录了1500+0 的读入
记录了1500+0 的写出
1572864000字节(1.6 GB,1.5 GiB)已复制,2.14529 s,733 MB/s
SD image device: /dev/loop13
请检查现在是不是有人在使用此磁盘... 好的
Disk /dev/loop13:1.48 GiB,1572864000 字节,3072000 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
创建了一个磁盘标识符为 0x181bdd69 的新 DOS 磁盘标签。
/dev/loop13p1: 创建了一个新分区 1,类型为“W95 FAT16 (LBA)”,大小为 64 MiB。
/dev/loop13p2: 创建了一个新分区 2,类型为“Linux”,大小为 1.4 GiB。
/dev/loop13p3: 完成。
新状况:
磁盘标签类型:dos
磁盘标识符:0x181bdd69
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/loop13p1 * 2048 133119 131072 64M e W95 FAT16 (LBA)
/dev/loop13p2 133120 3071999 2938880 1.4G 83 Linux
分区表已调整。
partprobe
mkfs.fat 4.1 (2017-01-24)
mke2fs 1.45.5 (07-Jan-2020)
创建含有 367360 个块(每块 4k)和 91968 个 inode 的文件系统
文件系统 UUID:68d82fa1-1bb5-435f-a5e3-862176586eec
超级块的备份存储于下列块:
32768, 98304, 163840, 229376, 294912
正在分配组表: 完成
正在写入 inode表: 完成
创建日志(8192 个块): 完成
写入超级块和文件系统账户统计信息: 已完成
/home/yz/vivado-risc-v/debian-riscv64/rootfs /home/yz/vivado-risc-v
/home/yz/vivado-risc-v
/home/yz/vivado-risc-v/debian-riscv64/boot /home/yz/vivado-risc-v
/home/yz/vivado-risc-v
Boot partition:
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/loop13p1 65390 25146 40244 39% /home/yz/vivado-risc-v/debian-riscv64/boot
总用量 1360
-rwxr-xr-x 1 root root 1388640 3月 6 05:15 boot.elf
drwxr-xr-x 2 root root 2048 3月 6 05:15 extlinux
Root partition:
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/loop13p2 1409240 734116 585268 56% /home/yz/vivado-risc-v/debian-riscv64/rootfs
总用量 262220
lrwxrwxrwx 1 root root 7 10月 29 23:49 bin -> usr/bin
drwxr-xr-x 2 root root 4096 11月 6 13:02 boot
drwxr-xr-x 4 root root 4096 10月 3 14:30 dev
drwxr-xr-x 61 root root 4096 11月 6 13:02 etc
drwxr-xr-x 3 root root 4096 10月 29 23:52 home
lrwxrwxrwx 1 root root 7 10月 29 23:49 lib -> usr/lib
drwx------ 2 root root 16384 10月 30 00:00 lost+found
drwxr-xr-x 2 root root 4096 10月 29 23:49 media
drwxr-xr-x 2 root root 4096 10月 29 23:49 mnt
drwxr-xr-x 2 root root 4096 10月 29 23:49 opt
drwxr-xr-x 2 root root 4096 10月 3 14:30 proc
drwx------ 3 root root 4096 10月 29 23:53 root
drwxr-xr-x 4 root root 4096 10月 29 23:53 run
lrwxrwxrwx 1 root root 8 10月 29 23:49 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 10月 29 23:49 srv
-rw------- 1 root root 268435456 11月 6 13:02 swapfile
drwxr-xr-x 2 root root 4096 10月 3 14:30 sys
drwxrwxrwt 2 root root 4096 11月 6 12:48 tmp
drwxr-xr-x 11 root root 4096 10月 29 23:49 usr
drwxr-xr-x 11 root root 4096 10月 29 23:49 var
fsck.fat 4.1 (2017-01-24)
/dev/loop13p1: 6 files, 12573/32695 clusters
rootfs:17517/91968 文件(0.0% 为非连续的),198579/367360 块
Copy disk image to:
Disk /dev/sdb:28.84 GiB,30945574912 字节,60440576 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x79922aad
Are you sure? [y/N] y
1566048256字节(1.6 GB,1.5 GiB)已复制,9 s,174 MB/s
记录了24000+0 的读入
记录了24000+0 的写出
1572864000字节(1.6 GB,1.5 GiB)已复制,115.244 s,13.6 MB/s
请检查现在是不是有人在使用此磁盘... 好的
Disk /dev/sdb:28.84 GiB,30945574912 字节,60440576 个扇区
Disk model: Storage Device
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x181bdd69
旧状况:
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 * 2048 133119 131072 64M e W95 FAT16 (LBA)
/dev/sdb2 133120 3071999 2938880 1.4G 83 Linux
/dev/sdb2:
新状况:
磁盘标签类型:dos
磁盘标识符:0x181bdd69
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/sdb1 * 2048 133119 131072 64M e W95 FAT16 (LBA)
/dev/sdb2 133120 60440575 60307456 28.8G 83 Linux
分区表已调整。
将调用 ioctl() 来重新读分区表。
重新读取分区表失败。: 设备或资源忙
内核仍在使用旧分区表。新分区表将在下次重启或运行 partprobe(8) 或 kpartx(8) 后生效。
正在同步磁盘。
fsck,来自 util-linux 2.34
e2fsck 1.45.5 (07-Jan-2020)
第 1 遍:检查 inode、块,和大小
第 2 遍:检查目录结构
第 3 遍:检查目录连接性
第 4 遍:检查引用计数
第 5 遍:检查组概要信息
rootfs:17517/91968 文件(0.0% 为非连续的),198579/367360 块
resize2fs 1.45.5 (07-Jan-2020)
将 /dev/sdb2 上的文件系统调整为 7538432 个块(每块 4k)。
/dev/sdb2 上的文件系统大小已经调整为 7538432 个块(每块 4k)。
mk-sd-image命令解析
https://github.com/eugene-tarassov/vivado-risc-v/blob/master/mk-sd-image
#!/bin/bash
set -e #表示后续所有的bash命令的返回code如果不是0,那么脚本立即退出,后续的脚本将不会得到执行的机会
cd -P `dirname $0`#切换到mk-sd-image脚本所在的目录
SD_SIZE=1500 #img大小为1500MB
SD_BOOT_SIZE=64 #boot分区为64MB
SD_SWAP_SIZE=
SD_IMG=debian-riscv64/debian-riscv64.sd.img #img文件的名称和相对路径
RSYNC_BOOT=
while getopts r:s:b:p:i: name ; do #对应命令行参数的解析
case $name in
r)
RSYNC_BOOT=$OPTARG
;;
s)
SD_SIZE=$OPTARG
;;
b)
SD_BOOT_SIZE=$OPTARG
;;
p)
SD_SWAP_SIZE=$OPTARG
;;
i)
SD_IMG=$OPTARG
;;
esac
done
if [ ! -d linux-stable/kernel ] ; then #如果不能存在linux-stable/kernel路径,则执行子模块更新
make update-submodules
fi
KERNEL_VER=$(cd linux-stable && git describe --exact-match --abbrev=0) #获取内核版本号,实际为当前分支最新的(只考虑)带注释的tag
# --- Retrive Debian disk image ---
make debian-riscv64/initrd debian-riscv64/rootfs.tar.gz #获取已编译好的引导用临时根文件系统(initrd)和根文件系统rootfs.tar.gz
# --- Build BBL and Linux ---
if [ ! -f workspace/boot.elf ] ; then #编译bootloader
make bootloader
fi
if [ ! -f linux-stable/arch/riscv/boot/Image ] ; then #编译linux
make linux
fi
# --- build SD card image ---
mount -l | grep `pwd`/ | while IFS=' ' read -ra LINE ; do #读出所有挂载的文件系统,匹配其中包含当前目录的行,以空格符分隔读取这一行的内容放入LINE中,其中第一个变量就是文件系统的名称,然后取消其挂载,不明白为什么要取消?
sudo umount ${LINE[0]}
done
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do #找到与当前路径相关的循环设备,并进行卸载
sudo losetup -d ${LINE[0]}
done
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do #如果发现循环设备依然存在,则警告卸载不成功,退出执行
echo "Cannot detach ${LINE[*]}"
exit 1
done
rm -f $SD_IMG #删除已存在的img文件
dd if=/dev/zero of=$SD_IMG bs=1M count=$SD_SIZE #构建一个SD_SIZE MB大小的镜像文件
sudo losetup -f $SD_IMG #-f查找第一个空闲的循环设备,然后将img文件虚拟成对应的循环块设备
SD_LOOP=$(
losetup -a | grep `pwd`/ | while IFS=':' read -ra LINE ; do #-a列出所有的循环设备,从中找出对应虚拟的循环设备名称
echo ${LINE[0]}
done
)
echo "SD image device: ${SD_LOOP}" #打印对应循环设备名称
sudo sfdisk --no-tell-kernel ${SD_LOOP} <<-__EOF__ #执行分区操作,不通知内核分区表的变化
1M,${SD_BOOT_SIZE}M,0xE,* #${BOOT_ROM_SIZE},${ROOT_SYSTEM_SIZE},Linux分区标识
,,,-
__EOF__
sudo partprobe ${SD_LOOP} #重读分区表,将磁盘分区表变化信息通知内核,请求操作系统重新加载分区表
UUID=68d82fa1-1bb5-435f-a5e3-862176586eec #设定硬盘的UUID
sudo mkfs.vfat -F 16 -n BOOT ${SD_LOOP}p1 #格式化第一个分区p1为FAT16格式,分区名BOOT,
sudo mkfs.ext4 -E nodiscard -L rootfs -U $UUID ${SD_LOOP}p2 #格式化第二个分区p2为ext4,名称为rootfs,UUID如上
cat >debian-riscv64/extlinux.conf <<EOF #在启动配置文件debian-riscv64/extlinux.conf中,写入启动参数和内核文件名称
menu title RISC-V Boot Options.
timeout 50
default Debain $KERNEL_VER #设置为默认启动标签
label Debain $KERNEL_VER #可供uboot选择的内核标签
kernel /extlinux/image-$KERNEL_VER #指定内核镜像文件
initrd /extlinux/initrd-$KERNEL_VER.img #指定引导时根文件系统
append ro root=UUID=$UUID earlycon initramfs.runsize=24M locale.LANG=en_US.UTF-8 #
EOF
mkdir -p debian-riscv64/boot #强行创建boot目录
mkdir -p debian-riscv64/rootfs #强行创建rootfs目录
sudo mount ${SD_LOOP}p1 debian-riscv64/boot #将第一个分区挂载到boot目录
sudo mount ${SD_LOOP}p2 debian-riscv64/rootfs #将第二个分区挂载到rootfs目录
pushd debian-riscv64/rootfs #保存rootfs路径到路径栈,并进入rootfs目录
if [ -z "$SD_SWAP_SIZE" ] ; then #-z 字符串长度为0即为真
sudo tar xzf ../rootfs.tar.gz #解压文件系统
else
sudo tar --exclude=swapfile -xzf ../rootfs.tar.gz #解压时排除swapfile文件
sudo fallocate -l ${SD_SWAP_SIZE}M swapfile #创建如此大小的swapfile文件
sudo chmod 600 swapfile #修改权限
sudo mkswap swapfile #格式化为swap文件系统
fi
popd #弹出rootfs路径,并回到主目录
pushd debian-riscv64/boot #保存boot路径到路径栈,并进入boot目录
sudo mkdir extlinux
sudo cp ../extlinux.conf extlinux
sudo cp ../initrd extlinux/initrd-$KERNEL_VER.img
sudo cp ../../linux-stable/arch/riscv/boot/Image extlinux/image-$KERNEL_VER
sudo cp ../../workspace/boot.elf boot.elf
popd #弹出boot路径,并回到主目录
sudo chown root:root debian-riscv64/rootfs #改变文件夹所有者
sudo chmod 755 debian-riscv64/rootfs #改变文件夹权限
echo
echo "Boot partition:"
df debian-riscv64/boot #查看文件系统信息
ls -l debian-riscv64/boot #查看文件信息
echo
echo "Root partition:"
df debian-riscv64/rootfs
ls -l debian-riscv64/rootfs
echo
if [ ! -z "$RSYNC_BOOT" ] ; then
rsync -r --delete debian-riscv64/boot/ $RSYNC_BOOT #删除远端$RSYNC_BOOT目录有而boot目录没有的文件
fi
# According to docs, don't need to run sync before umount.
# umount will complete all pending writes before it actually unmounts the filesystem.
# In reality, without sync, VFAT filesystem sometimes gets corrupted after umount.
# Must be a Linux bug.
sync
sudo umount ${SD_LOOP}p1 #取消挂载p1分区
sudo umount ${SD_LOOP}p2 #取消挂载p2分区
sudo fsck -f -p -T ${SD_LOOP}p1 || true #检查文件系统并尝试修复出现的错误,-p⾃动修复⽂件系统错误,-f强制检查,即使⽂件系统被标记⼲净,-T执行fsck指令时,不显示标题信息。。保证这个命令为真
sudo fsck -f -p -T ${SD_LOOP}p2 #
sudo losetup -d ${SD_LOOP} #卸载掉循环设备
mk-sd-card命令解析
https://github.com/eugene-tarassov/vivado-risc-v/blob/master/mk-sd-card
#!/bin/bash
set -e
cd `dirname $0`
if [ "$1" != "skip_mk_img" ]; then
./mk-sd-image
fi
# --- copy SD card image to physical media ---
SD_IMG=debian-riscv64/debian-riscv64.sd.img
for DEVICE in `ls /dev/disk/by-path/*-usb-*-scsi-*` ; do #获取当前的USB设备
case $DEVICE in #如果包含-part字符串则继续
*-part*)
continue
;;
esac
echo
echo
DEVICE=`realpath $DEVICE`
echo "Copy disk image to:"
sudo sfdisk -l $DEVICE || continue #||的作用:如果前一条命令为假,则继续执行后面的命令,如果前一条命令为真,则后面的命令不会执行
read -r -p "Are you sure? [y/N] " response
case "$response" in
[yY][eE][sS]|[yY])
sudo dd if=$SD_IMG of=$DEVICE bs=64K status=progress
sudo sync
sudo partprobe ${DEVICE}
sleep 3
echo ", +" | sudo sfdisk -N 2 ${DEVICE} #根据标准输入进行分区 还是 重新修改分区标签?
sudo partprobe ${DEVICE}
sudo fsck -f ${DEVICE}2 #磁盘检查
sudo resize2fs ${DEVICE}2 #文件系统重定义大小工具
sudo sync
break
;;
*)
continue
;;
esac
done