İçeriğe geç

FUSE ile Linux’ta Sahte Dosya Sistemi Oluşturma

Kategori: Uncategorized

Linux’ta gerçek diske yazmadan, yalnızca yazılım üzerinden çalışan dosya sistemleri oluşturmak mümkündür. Bu sistemler genellikle test, eğitim veya özel uygulamalar için kullanılır. Bunu yapmanın en kolay yolu FUSE aracıdır.

FUSE Nedir?

FUSE, çekirdeğe dokunmadan kullanıcı alanında dosya sistemi yazmanızı sağlar. Bu sayede modülü geliştirmeden yeni bir dosya sistemi oluşturabiliriz.

Sahte Dosya Sistemi Nedir?

Sahte dosya sistemi, aslında diskte yer almayan ama sistem tarafından dosya sistemi gibi görünen yapılardır.
Bu tür sistemlerde, dosyalar ve klasörler fiziksel olarak mevcut değildir.

/proc ve /sys gibi sistem dizinleri, aslında kernel verilerini dosya şeklinde sunan sahte dosya sistemleridir. tmpfs, veriyi RAM’de tutarak geçici bir dosya sistemi sağlar. sshfs, uzak bir sunucudaki klasörü yerel bir dizinmiş gibi gösterir.

Eğer belleği verimli kullanma konusuna ilginiz varsa, Linux’ta Swap Alanı Nasıl Oluşturulur? yazımızda sistem belleğini genişletmenin pratik yollarını da inceleyebilirsiniz.

FUSE Kurulumu

Debian veya Ubuntu tabanlı bir sunucu sistemi kullanıyorsak, öncelikle paket depolarını güncelleyelim ve gerekli bağımlılıkları sistemimize kuralım.

sudo apt update
sudo apt install build-essential libfuse3-dev pkg-config

Eğer Python ile FUSE tabanlı bir proje geliştirmeyi düşünüyorsak, fusepy paketini de yükleyelim.

pip3 install fusepy

Kurulum işlemleri tamamlandıktan sonra FUSE’un sisteme düzgün şekilde yüklendiğini doğrulayalım.

lsmod | grep fuse

Bu komutun çıktısında fuse satırını görüyorsak, kurulumun başarıyla tamamlandığını anlayabiliriz.

Linux Sahte Dosya Oluşturma

Şimdi basit bir örnek oluşturalım. Bu örnekte /hello adında sanal bir dosya yaratacağız.

#define FUSE_USE_VERSION 35
#include <fuse3/fuse.h>
#include <string.h>
#include <errno.h>

static const char *path_hello = "/hello";
static const char *content = "Merhaba FUSE\n";

static int getattr_cb(const char *path, struct stat *st) {
    memset(st, 0, sizeof(struct stat));
    if (strcmp(path, "/") == 0) {
        st->st_mode = S_IFDIR | 0755;
        st->st_nlink = 2;
        return 0;
    }
    if (strcmp(path, path_hello) == 0) {
        st->st_mode = S_IFREG | 0444;
        st->st_size = strlen(content);
        return 0;
    }
    return -ENOENT;
}

static int readdir_cb(const char *path, void *buf, fuse_fill_dir_t filler,
                      off_t off, struct fuse_file_info *fi) {
    if (strcmp(path, "/") != 0) return -ENOENT;
    filler(buf, ".", NULL, 0);
    filler(buf, "..", NULL, 0);
    filler(buf, "hello", NULL, 0);
    return 0;
}

static int open_cb(const char *path, struct fuse_file_info *fi) {
    return strcmp(path, path_hello) ? -ENOENT : 0;
}

static int read_cb(const char *path, char *buf, size_t size, off_t off,
                   struct fuse_file_info *fi) {
    if (strcmp(path, path_hello)) return -ENOENT;
    size_t len = strlen(content);
    if (off >= len) return 0;
    if (off + size > len) size = len - off;
    memcpy(buf, content + off, size);
    return size;
}

static struct fuse_operations ops = {
    .getattr = getattr_cb,
    .readdir = readdir_cb,
    .open = open_cb,
    .read = read_cb,
};

int main(int argc, char *argv[]) {
    return fuse_main(argc, argv, &ops, NULL);
}

Kod dosyasını hello_fuse.c olarak kaydedelim ve ardından derleme işlemini gerçekleştirelim.

gcc hello_fuse.c -o hello_fuse `pkg-config fuse3 --cflags --libs`

Mount işlemi için bir dizin oluşturalım ve sanal dosya sistemimizi oraya bağlayalım.

mkdir /tmp/mount
./hello_fuse /tmp/mount

Sanal dosya sistemimiz aktif hale geldi. Şimdi oluşturduğumuz sanal dosyayı okuyarak sonucu görelim:

cat /tmp/mount/hello

İşimiz bittikten sonra sanal dosya sistemini güvenli şekilde ayırmak için şu komutu çalıştıralım:

fusermount3 -u /tmp/mount

Eğer dosya sistemi testleri sırasında hata veya bozukluk tespit edersen, Linux Hata Onarımı İçin fsck rehberindeki adımlar, sanal veya fiziksel disklerde güvenli şekilde onarım yapmana yardımcı olur.

Python ile Sahte Dosya Oluşturma

Aynı işlemi bu kez Python kullanarak da gerçekleştirebiliriz. fusepy kütüphanesi sayesinde, birkaç satır kodla kendi sanal dosya sistemimizi oluşturalım.

from fuse import FUSE, Operations
import stat, time

class Hello(Operations):
    def getattr(self, path, fh=None):
        if path == '/':
            return dict(st_mode=(stat.S_IFDIR | 0o755), st_nlink=2)
        if path == '/hello':
            return dict(st_mode=(stat.S_IFREG | 0o444), st_size=15)
        raise FileNotFoundError

    def readdir(self, path, fh):
        return ['.', '..', 'hello']

    def read(self, path, size, offset, fh):
        return b"Merhaba FUSE\n"[offset:offset+size]

FUSE(Hello(), '/tmp/hello_py', foreground=True)

Bu örnekte /tmp/hello_py adında bir sanal dosya sistemi oluşturuyoruz. İçinde hello adlı bir dosya yer alacak ve dosya okunduğunda ekrana “Merhaba FUSE” metni yazdırılacak.

Kodu çalıştıralım.

python3 hello.py

Ardından oluşturulan dosyayı test edelim.

cat /tmp/hello_py/hello

Son olarak, işlemi tamamladıktan sonra dosya sistemini kapatabilmek için Ctrl + C tuşlarına basalım.

Sık Sorulan Sorular

FUSE tam olarak nasıl çalışır?

FUSE, çekirdek modülünün dosya sistemi çağrılarını kullanıcı alanındaki bir programa yönlendirmesiyle çalışır. Yani dosya işlemleri doğrudan kernel tarafından değil, kullanıcı alanındaki bir uygulama tarafından yönetilir.

FUSE ile oluşturulan dosya sistemleri neden kernel seviyesinde değildir?

FUSE’un amacı, geliştiricilerin güvenli bir ortamda dosya sistemi prototipleri yazmasını sağlamaktır. Kullanıcı alanında çalıştığı için çekirdek çökmesine yol açmadan hatalar yakalanabilir.

FUSE’un performansı hangi durumlarda sınırlı olur?

Her dosya işlemi kullanıcı alanı ile çekirdek arasında ek bir geçiş gerektirdiğinden, FUSE tabanlı sistemler yüksek I/O yoğunluklu senaryolarda yavaşlayabilir.

FUSE kullanımı için özel izin gerekir mi?

Eğer sistem yöneticisi kullanıcıya /etc/fuse.conf üzerinden erişim izni verdiyse, root yetkisi gerekmeden FUSE dosya sistemleri oluşturulabilir. Aksi durumda “permission denied” hatası alınabilir.

FUSE dosya sisteminde hata ayıklama (debug) nasıl yapılır?

FUSE uygulamaları çalıştırılırken -d veya --debug parametresi eklenerek hata çıktıları ayrıntılı şekilde görülebilir.

./hello_fuse -d /tmp/mount

Bu sayede dosya işlemleri, erişim talepleri ve hata mesajları gerçek zamanlı olarak takip edilebilir.

FUSE dosya sistemi nasıl kapatılır veya kaldırılır?

Bağlı bir FUSE dosya sistemini devre dışı bırakmak için şu komutu çalıştıralım

fusermount3 -u /tmp/mount

Bu işlem, sanal dosya sistemini güvenli şekilde ayırır ve bellekteki kaynakları serbest bırakır.

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir