解决linux自动挂载U盘/SD Card变成只读问题

本文介绍了一种解决Ubuntu系统中SD卡变为只读的问题方法。通过检查系统日志定位到文件系统的错误,并利用dosfsck命令修复损坏的文件系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

忘了从什么时候开始我的那个512M的SD卡在ubuntu下一挂载就是只读的了,使用root帐户更改权限都不好使,尝试了好多办法也没解决,后来买了个U盘就不再用SD卡了,这件事也就忘记了。

今天突然应急使用这个卡,使用读卡器挂载发现依旧是只读,换用本本内置的读卡器,也是一样。没办法了,google一通,看了看ubuntu的中文论坛,发现有人也遇到了同样的问题,但是没有人给出可行的解决方案。只好看看英文的网站了,果然找到了办法,原文在这

产生这个问题的原因是SD卡的文件系统损坏,操作系统为了防止进一步毁坏文件系统,而将其设置成了只读。检查文件系统的方法如下:

在没挂载SD卡的时候在shell中输入:tail -f /var/log/syslog,查看动态日志文件。

然后插入SD卡,可以看到日志文件的变化,大致如下:

Apr 5 00:24:59 sagi-laptop kernel: [ 1048.660202] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.660214] invalid access to FAT (entry 0x0000b30e) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.660218] File system has been set read-only Apr 5 00:24:59 sagi-laptop kernel: [ 1048.676591] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.676603] invalid access to FAT (entry 0x0000d0c9) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.678906] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.678916] invalid access to FAT (entry 0x00008522) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.695071] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.695081] invalid access to FAT (entry 0x0000e673) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.719951] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.719965] invalid access to FAT (entry 0x0000d751) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.818747] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.818764] fat_get_cluster: invalid cluster chain (i_pos 0) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.818929] FAT: Filesystem panic (dev sdb1) Apr 5 00:24:59 sagi-laptop kernel: [ 1048.818931] invalid access to FAT (entry 0x0000bab9)

可以大致看出是/dev/sdb1也就是usb文件系统出错的消息。
OK,接下来开始修复它:

首先卸载设备,然后输入:sudo dosfsck -v -a /dev/sdb1,检查并修复文件系统。
一长串输出大概如下:

dosfsck 2.11 (12 Mar 2005) dosfsck 2.11, 12 Mar 2005, FAT32, LFN Checking we can access the last sector of the filesystem Boot sector contents: System ID " " Media byte 0xf8 (hard disk) 512 bytes per logical sector 16384 bytes per cluster 1 reserved sector First FAT starts at byte 512 (sector 1) 2 FATs, 16 bit entries 62976 bytes per FAT (= 123 sectors) Root directory starts at byte 126464 (sector 247) 512 root directory entries Data area starts at byte 142848 (sector 279) 31312 data clusters (513015808 bytes) 63 sectors/track, 16 heads 233 hidden sectors 1002263 sectors total /DcOo CS1.6.rar and /Music share clusters. Truncating second to 180387840 bytes. Reclaiming unconnected clusters. Reclaimed 10723 unused clusters (175685632 bytes) in 1 chain. Performing changes. /dev/sdb1: 166 files, 25779/31312 clusters

说明已经检查完毕,重新插上SD卡试试吧,应该已经可以写入了。

#include <stdio.h> #include <string.h> #include <driver/sdmmc_host.h> #include <sdmmc_cmd.h> #include <esp_vfs_fat.h> #include <esp_log.h> #define BSP_SD_CLK (47) #define BSP_SD_CMD (48) #define BSP_SD_DAT0 (21) #define MOUNT_POINT "/sdcard" #define EXAMPLE_MAX_CHAR_SIZE 64 static const char *TAG = "main"; //向文件里写入数据 static esp_err_t s_example_write_file(const char *path, char* data){ FILE *f = fopen(path, "w"); //以写入格式打开文件(新建) if (f == NULL) { ESP_LOGE(TAG, "Failed to open file for writling"); return ESP_FAIL; } fprintf(f, data);//写入文件 fclose(f);//关闭文件 ESP_LOGE(TAG, "写入完成"); return ESP_OK; } //读取文件数据 static esp_err_t s_example_read_file(const char *path){ //以只读方式打开文件 FILE *f = fopen(path, "r"); char line[EXAMPLE_MAX_CHAR_SIZE];//定义一个字符串用于接收数据 fgets(line, sizeof(line), path); fclose(f); ESP_LOGE(TAG, "读取完成"); char *pos = strchr(line, '\n'); if (pos) { *pos = '\0'; } ESP_LOGE(TAG, "Read from file:'%s'", line); return ESP_OK; } void app_main(void) { esp_err_t ret; //配置挂载信息 esp_vfs_fat_mount_config_t mount_cfg = { .allocation_unit_size = 1024, .format_if_mount_failed = true, .max_files = 5 }; //初始化主机 sdmmc_host_t host = SDMMC_HOST_DEFAULT(); host.flags = SDMMC_HOST_FLAG_1BIT; //1线模式 //初始化卡槽 sdmmc_slot_config_t slot_cfg = SDMMC_SLOT_CONFIG_DEFAULT(); slot_cfg.clk = BSP_SD_CLK; slot_cfg.cmd = BSP_SD_CMD; slot_cfg.d0 = BSP_SD_DAT0; slot_cfg.flags = SDMMC_SLOT_FLAG_INTERNAL_PULLUP; //定义card指针,供配置程序使用 sdmmc_card_t *card; const char mount_point[] = MOUNT_POINT; ESP_LOGI(TAG, "Initializing SD card"); ESP_LOGI(TAG, "使用SDMMC外设"); ESP_LOGI(TAG, "Mounting filesystem"); ret = esp_vfs_fat_sdmmc_mount(mount_point, &host, &slot_cfg, &mount_cfg, &card); if (ret != ESP_OK) { // 如果没有挂载成功 if (ret == ESP_FAIL) { // 如果挂载失败 ESP_LOGE(TAG, "Failed to mount filesystem. "); } else { // 如果是其它错误 打印错误名称 ESP_LOGE(TAG, "Failed to initialize the card (%s). ", esp_err_to_name(ret)); } return; } ESP_LOGI(TAG, "Filesystem mounted"); // 提示挂载成功 sdmmc_card_print_info(stdout, card); // 终端打印SD卡的一些信息 const char *file_hello = MOUNT_POINT"/hello你好.txt"; //新建一个数据并将数据写入 char data[EXAMPLE_MAX_CHAR_SIZE]; snprintf(data, EXAMPLE_MAX_CHAR_SIZE, "%s %s!\n", "你好hello", card->cid.name); //将数据写入文件 ret = s_example_write_file(file_hello, data); if (ret!=ESP_OK) { return; } //打开文件并读取数据 ret = s_example_read_file(file_hello); if (ret!=ESP_OK) { return; } //卸载sd卡 esp_vfs_fat_sdcard_unmount(MOUNT_POINT, card); ESP_LOGI(TAG, "Card unmounted"); } 检查这段代码的错误
最新发布
06-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值