解决:内核没办法正常挂载文件系统,错误log:devtmpfs: error mounting -2

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命令去操作压缩包

结果这样解压就不会报错了

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值