Как найти физическое смещение файла в BTRFS?

Вот мой простой скрипт для копирования ssh -keygen на несколько серверов без запроса пароля каждый раз.

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done

Для этого требуется sshpass , который может потребоваться установить отдельно либо через пакет, либо из исходного кода.

0
11.12.2020, 11:39
1 ответ

Ниже представлена ​​программа на C, которая вычисляет начальное смещение от начала раздела для некоторых файлов в файловой системе Btrfs. Кажется, нет надежного способа сделать это для Btrfs.

#include <unistd.h>
#include <linux/fs.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/fiemap.h>

int main(int argc, char **argv)
{
    char buffer[sizeof (struct fiemap) + sizeof (struct fiemap_extent)];
    struct fiemap *map = (struct fiemap *)buffer;
    map->fm_start = 0;
    map->fm_length = 4096;
    map->fm_flags = FIEMAP_FLAG_SYNC;
    map->fm_extent_count = 1; /* If you change this, you'll need to enlarge `buffer´. */
    map->fm_reserved = 0;

    int fd;
    if (argc < 2) {
        fprintf(stderr, "Usage %s filename\n", argv[0]);
        return 1;
    }
    fd = open(argv[1], O_RDONLY);
    if (fd < 0) {
        perror("Error opening file");
        return 1;
    }   
    int block = 0;
    int ret = ioctl(fd, FS_IOC_FIEMAP, map);
    if (ret < 0) {
        perror("ioctl");
        close(fd);
        return 1;
    }

    close(fd);
    printf("Number of extents returned: %ld\n", map->fm_mapped_extents);
    printf("File %s starts at byte offset %lu\n", argv[1], map->fm_extents[0].fe_physical);
    return 0;
}
2
18.03.2021, 22:43

Теги

Похожие вопросы