C++ C/C++;:读写索引节点ext4

C++ C/C++;:读写索引节点ext4,c++,linux,ext4,ext2,C++,Linux,Ext4,Ext2,基本上,我正在尝试创建自己的工具来快速格式化ext4分区 据我所知,它背后的思想是用空的ext2\u inode结构查找并覆盖现有inode。我想我可以通过简单地计算sb.s\u inodes\u count和sb.s\u free\u inodes\u count之间的差异来实现这一点,这样我就知道需要覆盖多少inodes 但事实上,它不起作用(只是毕竟无法安装),我很好奇为什么。如果是这样,那么如何找到正确的inode位置(如果我发现不正确的话)以及如何正确地编写空结构 #包括 #包括 #包

基本上,我正在尝试创建自己的工具来快速格式化ext4分区

据我所知,它背后的思想是用空的
ext2\u inode
结构查找并覆盖现有inode。我想我可以通过简单地计算
sb.s\u inodes\u count
sb.s\u free\u inodes\u count
之间的差异来实现这一点,这样我就知道需要覆盖多少inodes

但事实上,它不起作用(只是毕竟无法安装),我很好奇为什么。如果是这样,那么如何找到正确的inode位置(如果我发现不正确的话)以及如何正确地编写空结构

#包括
#包括
#包括
#包括
#包括
#包括“Disk.h”
使用名称空间std;
磁盘::磁盘(字符串路径){
试一试{
这->fd=open(path.c_str(),O_RDWR);
如果(this->fd==-1)抛出新的CantoPendDevice;
}捕获(CantOpenDevice&openError){
记录器->错误(openError.what());
}
}
ext2_超级块磁盘::readSuperBlock(){
lseek(this->fd,1024,SEEK_SET);//1024-组0填充
读(this->fd,&this->sb,sizeof(ext2_超级块));
此->记录器->调试(“成功读取超级块”);
把这个还给某人;
}
ext4_group_desc Disk::readFirstBGD(){
int block_size_offset=this->getBlockSizeOffset();
lseek(此->fd,块大小偏移,搜索集);
读取(此->fd,&此->bg,sizeof(ext4\u group\u desc));
此->记录器->调试(“成功读取组描述符”);
返回此->背景;
}
无效磁盘::WriteEmptyNodes(){
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;ifd,&inode,sizeof(inode));
}
}
int Disk::getBlockSizeOffset(){
返回1024个sb.s\u log\u block\u大小;
}
磁盘::~Disk(){
关闭(此->fd);
删除记录器;
}

旁注:为什么你
抛出新的CantonPendDevice
只是为了捕获并记录到下一行?另外,当您抛出
时,不要执行
新建
。现在,您将抛出一个指向
CantOpenDevice
(不
delete
)的指针,而不是
CantOpenDevice
。为什么不干脆做
if(this->fd==-1)记录器->错误(“消息”)?另一件事:您应该封装
fd
logger
来管理它们自己的资源,这样您就不必在
Disk
类中实现析构函数。您可能还需要更新
组描述符表
,清除
索引节点位图块
,处理灵活块(如果在ext4中启用了它),等等。换句话说,这比简单地从
inode表中清空inode要复杂得多。
@campescassiano-uh,是的,完全忘记了引用inode的其他数据项。旁注:为什么
抛出新的CantOpenDevice
只是为了捕获并记录到下一行?另外,当您抛出
时,不要执行
新建
。现在,您将抛出一个指向
CantOpenDevice
(不
delete
)的指针,而不是
CantOpenDevice
。为什么不干脆做
if(this->fd==-1)记录器->错误(“消息”)?另一件事:您应该封装
fd
logger
来管理它们自己的资源,这样您就不必在
Disk
类中实现析构函数。您可能还需要更新
组描述符表
,清除
索引节点位图块
,处理灵活块(如果在ext4中启用了它),等等。换句话说,它比简单地从
inode表中清空inode要复杂得多
@campescassiano uhh,是的,完全忘记了引用inode的其他数据项。