s32v234sbc的升级后第一次总是出现文件系统没办法挂载的情况
错误log:devtmpfs: error mounting -2
跟踪代码,他在内核 drivers/base/devtmpfs.c中
/*
* If configured, or requested by the commandline, devtmpfs will be
* auto-mounted after the kernel mounted the root filesystem.
*/
int devtmpfs_mount(const char *mntdir)
{
int err;
if (!mount_dev)
return 0;
if (!thread)
return 0;
err = sys_mount("devtmpfs", (char *)mntdir, "devtmpfs", MS_SILENT, NULL);
if (err)
printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
else
printk(KERN_INFO "devtmpfs: mounted\n");
return err;
}
进一步跟踪,发现mntdir参数是/dev这个目录,错误类型-2表示没有这个文件或者目录
这种情况在个人猜测两种可能
1.内核的启动参数出问题,加载的错误的emmc分区,加载目录是可以在make menuconfig中自己填写的。你的mbr分区表告诉emmc驱动他有几个分区,内核中加载emmc驱动后,就会产生这些分区,其中我的/dev/mmcblk0p2是放文件系统的分区,所以他去加载/dev/mmcblk0p2是正确的这种可能可以排除
2.我的文件系统没有/dev这个目录。
跟踪自己写的升级代码
system("mkdir -p /tmp/rootfs");
rootfs_tar = fopen("/tmp/dsm.rootfs.tar.gz","w+");
if (!rootfs_tar){
printf("create rootfs.tar.gz failed\n");
return -1;
}
rootfs_count = fwrite(fub_buf+szb_images_mbr->imageoffset,szb_images_mbr->imagesize,1,rootfs_tar);
if(rootfs_count != 1){
printf("save rootfs.tar failed rootfs_count = %d\n",rootfs_count);
return -1;
}
if(system("mkfs.ext4 -F /dev/mmcblk0p2") == -1)
return -1;
if(system("mount /dev/mmcblk0p2 /tmp/rootfs") == -1)
return -1;
system("tar -xz -C /tmp/rootfs/ -f /tmp/dsm.rootfs.tar.gz");
system("umount /dev/mmcblk0p2");
发现每次执行system("tar -xz -C /tmp/rootfs/ -f /tmp/dsm.rootfs.tar.gz");
这个命令后总是会有报错
tar: unexpected end of file
tar: short read
然后我去mount /dev/mmcblk0p2 到本地后发现,确实缺少了/dev这个目录
解压过程有问题,分两种情况
1.下载的压缩包有问题
手动执行tar -xz -C /tmp/rootfs/ -f /tmp/dsm.rootfs.tar.gz发现这样解压没有问题是由/dev这个目录的,说明压缩包没有问题
2.对压缩包读写有问题
因为保存压缩包是以文件流的形式的,不了解tar命令,很可能也是用文件流的形式去解压的,这样文件流指针就会给重复使用
所以我在保存完压缩包后,fclose(rootfs_tar)关闭,再去给tar命令去操作压缩包
结果这样解压就不会报错了