Linux’ta FUSE ile Sanal Dosya Sististemi Yapımı
Linux ortamında fiziksel diske veri yazmadan, yalnızca yazılım düzeyinde çalışan dosya sistemleri kurulabilir. Bu yapı genellikle deneme, eğitim ya da belirli amaçlara yönelik özel senaryolarda tercih edilir. Böyle bir sistemi oluşturmanın en pratik yolu FUSE aracını kullanmaktır.
FUSE Nedir?
FUSE, çekirdek düzeyine müdahale etmeden kullanıcı alanında dosya sistemi oluşturmayı mümkün kılar. Bu yaklaşım, yeni bir modül geliştirmeye gerek kalmadan özel dosya sistemleri yazılmasını sağlar. FUSE kullanarak bulut depolama klasörleri tanımlanabilir, veritabanı ya da API verileri dosya biçiminde gösterilebilir ve bellekte çalışan geçici dosya sistemleri kurulabilir.

Sahte Dosya Sistemi Nedir?
Sahte dosya sistemi, aslında diskte yer almayan ancak işletim sistemi tarafından gerçek bir dosya sistemi gibi algılanan yapılardır. Bu yapılar içinde dosya ve klasörler fiziksel olarak bulunmaz, yalnızca yazılım aracılığıyla görüntülenir.
Linux’ta /proc ve /sys dizinleri bu tür sistemlere örnektir; çünkü çekirdek verilerini dosya biçiminde sunarlar. tmpfs belleği kullanarak geçici bir dosya sistemi oluştururken, sshfs uzak bir sunucudaki klasörü yerel bir dizinmiş gibi gösterir.
Bellek yönetimiyle ilgileniyorsanız, Linux Sistemlerde Swap Alanı Eklemek rehberimizde sistem belleğini genişletmenin kolay yöntemlerini bulabilirsiniz.
FUSE Kurulumu
Eğer Debian ya da Ubuntu tabanlı bir sistem kullanıyorsak, önce paket listelerini güncelleyelim ve ihtiyaç duyulan bağımlılıkları yükleyelim.
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
*Bu komutun çıktısında “Merhaba FUSE” yazısını görmeliyiz.
İş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 fsck Komutu Nasıl Kullanılır? rehberindeki adımlar, sanal veya fiziksel disklerde güvenli şekilde onarım yapmana yardımcı olur.
Python ile Sahte Dosya Sistemi 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.