Linux 更改ext4文件系统上的ondisk索引节点

Linux 更改ext4文件系统上的ondisk索引节点,linux,inode,ext3,ext4,Linux,Inode,Ext3,Ext4,我正在使用libext2fs修改磁盘inode,但它不工作。 我在挂载的文件系统(EXT4)上执行此操作。我试着在一个挂载的文件系统上运行e2fsck,它似乎可以工作(尽管它会发出警告) 下面是我的代码 它运行时没有错误,但在testfile.txt上执行stat时,我看不到任何更改 有什么想法吗?还是其他选择 #include <linux/fs.h> #include <ext2fs/ext2fs.h> #include <stdio.h> #includ

我正在使用
libext2fs
修改磁盘inode,但它不工作。 我在挂载的文件系统(EXT4)上执行此操作。我试着在一个挂载的文件系统上运行
e2fsck
,它似乎可以工作(尽管它会发出警告)

下面是我的代码

它运行时没有错误,但在testfile.txt上执行stat时,我看不到任何更改

有什么想法吗?还是其他选择

#include <linux/fs.h>
#include <ext2fs/ext2fs.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "e2p/e2p.h"

int main(int argc, char **argv)
{
    errcode_t ret;
    int flags;
    int superblock = 0;
    int open_flags = EXT2_FLAG_RW | EXT2_FLAG_64BITS | EXT2_FLAG_SKIP_MMP | EXT2_FLAG_NOFREE_ON_ERROR | EXT2_FLAG_FORCE;
    int blocksize = 0;
    ext2_filsys fs = NULL;
    struct ext2_inode inode;
    ext2_ino_t root, cwd, inum;
    int i, c;
    struct stat fileStat;

    const char * str = "This will be output to testfile.txt\n";

    //Create some file for testing.
    FILE * filedesc = fopen( "/home/test/testfile.txt", "w" );
    fprintf( filedesc, str );
    fclose( filedesc );

    //open the device..( this is already mounted, e2fsck works on mounted devices. so I hope this will work. )
    ret = ext2fs_open2( "/dev/sda1" , open_flags, superblock, blocksize, unix_io_manager, &fs );
    if( ret ) 
    {
        fprintf(stderr, "failed to open filesystem %d.\n", ret);
        return 1;
    }

    //Get the inode number of file using stat
    ret = stat( "/home/test/testfile.txt", &fileStat );
    if( ret )
    {
        fprintf(stderr, "failed to stat\n");
    }

    ret = ext2fs_read_inode(fs, fileStat.st_ino, &inode );
    if( ret )
    {
        fprintf(stderr, "failed to open inode\n");
    }

    //do some changes.
    inode.i_ctime += 1;

    ext2fs_mark_changed( fs );

    //write the modified inode.
    ret = ext2fs_write_inode( fs, fileStat.st_ino, &inode );
    if( ret )
    {
        fprintf(stderr, "failed to open inode\n");
    }

    //this didn't help
    ret = ext2fs_flush(fs);

    ret = ext2fs_close(fs);
    if( ret )
    {
        fprintf(stderr, "error while closing filesystem\n");
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“e2p/e2p.h”
int main(int argc,字符**argv)
{
errcode\u t ret;
国际旗帜;
int超级块=0;
int open_flags=EXT2_FLAG_RW | EXT2_FLAG_64位| EXT2_FLAG_SKIP_MMP | EXT2_FLAG_NOFREE_ON_ERROR | EXT2_FLAG_FORCE;
int blocksize=0;
ext2_filsys fs=NULL;
结构ext2_inode inode;
ext2_inou t root,cwd,inum;
int i,c;
struct stat fileStat;
const char*str=“这将输出到testfile.txt\n”;
//创建一些用于测试的文件。
FILE*filedesc=fopen(“/home/test/testfile.txt”,“w”);
fprintf(filedesc,str);
fclose(filedesc);
//打开设备…(此设备已安装,e2fsck可在已安装的设备上工作。因此,我希望此操作能够正常工作。)
ret=ext2fs_open2(“/dev/sda1”,打开标志、超级块、块大小、unix_io_管理器和fs);
如果(ret)
{
fprintf(stderr,“无法打开文件系统%d。\n”,ret);
返回1;
}
//使用stat获取文件的inode编号
ret=stat(“/home/test/testfile.txt”,&fileStat);
如果(ret)
{
fprintf(stderr,“无法统计\n”);
}
ret=ext2fs\u read\u inode(fs、fileStat.st\u ino和inode);
如果(ret)
{
fprintf(stderr,“无法打开inode\n”);
}
//做一些改变。
inode.i_ctime+=1;
ext2fs_标记_更改(fs);
//编写修改后的inode。
ret=ext2fs\u write\u inode(fs、fileStat.st\u ino和inode);
如果(ret)
{
fprintf(stderr,“无法打开inode\n”);
}
//这没用
ret=ext2fs_冲洗(fs);
ret=ext2fs_关闭(fs);
如果(ret)
{
fprintf(stderr,“关闭文件系统时出错\n”);
}
返回0;
}

避免在装入的文件系统上写入directly@BasileStarynkevitch我明白…在运行上述程序后,我重新启动了系统,并看到我的更改得到了提交。看起来我只是在做vfs层的更改。有没有办法将vfs索引节点强制提交到磁盘?…我尝试了fsync,但没有luckDon不这样做;内核正在维护一个复杂而强大的磁盘缓存。如果你想这样做,黑客的内核文件系统或VFS层
libext2
应在未安装的分区上使用。