По сути, я пытаюсь создать свой собственный инструмент для быстрого форматирования разделов ext4.
Насколько я понимаю, идея заключается в том, чтобы найти и перезаписать существующие inodes пустыми структурами ext2_inode
. Я думал, что могу сделать это, просто вычислив разницу между sb.s_inodes_count
и sb.s_free_inodes_count
, чтобы знать, сколько inode мне нужно перезаписать.
Но на самом деле это не работает (просто не удается смонтировать), и мне любопытно, почему. Если да, то как мне найти правильное расположение inode (если я нашел его неправильно) и что мне делать, чтобы правильно писать пустые структуры?
#include <iostream>
#include <ext2fs/ext2_fs.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include "Disk.h"
using namespace std;
Disk::Disk(string path){
try{
this->fd = open(path.c_str(), O_RDWR);
if(this->fd == -1) throw new CantOpenDevice;
} catch (CantOpenDevice& openError){
logger->error(openError.what());
}
}
ext2_super_block Disk::readSuperBlock(){
lseek(this->fd, 1024, SEEK_SET); // 1024 - Group 0 Padding
read(this->fd, &this->sb, sizeof(ext2_super_block));
this->logger->debug("Succesfully read superblock.");
return this->sb;
}
ext4_group_desc Disk::readFirstBGD(){
int block_size_offset = this->getBlockSizeOffset();
lseek(this->fd, block_size_offset, SEEK_SET);
read(this->fd, &this->bg, sizeof(ext4_group_desc));
this->logger->debug("Succesfully read a group descriptor.");
return this->bg;
}
void Disk::writeEmptyInodes(){
ext2_inode inode = {0};
int block_size_offset = this->getBlockSizeOffset();
int inodes_to_clean = this->sb.s_inodes_count - this->sb.s_free_inodes_count;
for(int i=1; i < inodes_to_clean; i++){
write(this->fd, &inode, sizeof(inode));
}
}
int Disk::getBlockSizeOffset(){
return 1024 << this->sb.s_log_block_size;
}
Disk::~Disk(){
close(this->fd);
delete logger;
}