e2fsck的使用方法

命令:e2fsck 使用方法


工作中有报device强制断电后,文件系统出错的问题。第一次知道有个e2fsck的工具,自己了解了一些很浅显的知识,先mark下,在blog上。

当系统正在对某个文件系统的区域进行写入操作时(读的话没关系),突然断电,会造成文件系统对应区域的损坏(如写入脏数据), 而e2fsck算法就是用来恢复受损的文件系统,目的是:系统能够重启后,一切长长。当然,有损坏,想原样修复,当然不能100%保证,所以,就遇到了某些系统文件丢失,或者文件属性发生变化的事情。

 

  指令:e2fsck

  使用权限 : 超级使用者

  使用方式 : e2fsck [-pacnydfvFV] [-b superblock] [-B blocksize] [-l|-L bad_blocks_file] [-C fd] device

  说明 : 检查使用 Linux ext2 档案系统的 partition 是否正常工作

  参数 :

  device : 预备检查的硬碟 partition,例如:/dev/sda1

  -a : 对 partition 做检查,若有问题便自动修复,等同 -p 的功能

  -b : 设定存放 superblock 的位置

  -B : 设定单位 block 的大小

  -c : 检查该partition 是否有坏轨

  -C file : 将检查的结果存到 file 中以便查看

  -d : 列印 e2fsck 的 debug 结果

  -f : 强制检查

  -F : 在开始检查前,将device 的 buffer cache 清空,避免有错误发生

  -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面

  -L bad_blocks_file : 设定坏轨的block资料存到 bad_blocks_file 里面,若无该档则自动产生

  -n : 将档案系统以[唯读]方式开启

  -p : 对 partition 做检查,若有问题便自动修复

  -v : 详细显示模式

  -V : 显示出目前 e2fsck 的版本

  -y : 预先设定所有检查时的问题均回答[是]

  例子 :

  检查 /dev/hda5 是否正常,如果有异常便自动修复,并且设定若有问答,均回答[是] :

  e2fsck -a -y /dev/hda5

  注意 :

  大部份使用 e2fsck 来检查硬碟 partition 的情况时,通常都是情形特殊,因此最好先将该 partition umount,然后再执行 e2fsck 来做检查,若是要非要检查 / 时,则请进入 singal user mode 再执行。

### 如何在 C++ 中使用 `e2fsck` 进行文件系统检查 为了在 C++ 程序中调用 `e2fsck` 来执行 ext2/3/4 文件系统的检查,通常会通过系统调用来启动外部程序。这可以通过标准库函数如 `system()` 或者更复杂的进程管理接口来实现。 #### 使用 system() 函数 最简单的方法是利用 `<cstdlib>` 库中的 `system()` 函数直接运行命令: ```cpp #include <iostream> #include <cstdlib> int main(int argc, char *argv[]) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " <device>" << std::endl; return EXIT_FAILURE; } const char* device = argv[1]; int result = system((std::string("e2fsck -f ") + device).c_str()); if (WIFEXITED(result)) { int exit_status = WEXITSTATUS(result); switch(exit_status){ case 0: std::cout << "Filesystem is clean." << std::endl; break; case 1: std::cout << "Filesystem errors corrected." << std::endl; break; default: std::cout << "Other error occurred during filesystem check." << std::endl; } } else { std::cerr << "Failed to execute e2fsck command." << std::endl; } return result ? EXIT_FAILURE : EXIT_SUCCESS; } ``` 这种方法虽然简便易懂,但在安全性方面存在隐患,特别是当输入参数未经过充分验证时可能会引发安全漏洞。因此,在实际应用中建议采用更加严谨的方式处理子进程创建与通信。 #### 使用 fork 和 exec 家族函数 对于更高层次的需求以及更好的控制力,则应该考虑使用 POSIX 提供的低级 API —— `fork()` 创建新进程并配合 `execve()` 类函数加载目标可执行文件: ```cpp #include <unistd.h> #include <sys/wait.h> #include <cstring> #include <iostream> bool run_e2fsck(const char* dev_path) { pid_t child_pid; /* Fork a new process */ child_pid = fork(); if(child_pid == -1){ perror("Fork failed"); return false; } if (!child_pid){ // Child Process execlp("/sbin/e2fsck", "e2fsck", "-f", dev_path, nullptr); _exit(EXIT_FAILURE); // If we get here something went wrong with the exec call. }else{ // Parent Process int status; waitpid(child_pid,&status,0); if(WIFEXITED(status)){ int exit_code=WEXITSTATUS(status); switch(exit_code){ case 0: std::cout<<"No errors found on "<<dev_path<<".\n"; break; case 1: std::cout<<"Errors were fixed on "<<dev_path<<".\n"; break; default: std::cout<<"An unknown error has been encountered while checking "<<dev_path<<"\n"; } return true; }else{ std::cerr<<"Child did not terminate normally.\n"; return false; } } } int main(){ const char* test_device="/dev/sdX"; // Replace this value according to your needs. bool success=run_e2fsck(test_device); if(!success){ std::cerr<<"Error running e2fsck against:"<<test_device<<"\n"; } return !success; } ``` 上述代码展示了如何在一个新的进程中执行 `e2fsck` 命令,并等待其完成以便获取返回状态码。这种方式提供了更高的灵活性和安全性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值