VPS-এ ZFS: RAM খরচ ও সুবিধার হিসাব
ZFS checksummed data, বিনামূল্যের snapshot, send/receive replication ও compression দেয়, কিন্তু ARC RAM নেয়। 2 GB বা 4 GB VPS-এ এটি কীভাবে বিচার করবেন জানুন।
ZFS আপনাকে কী দেয় এবং এর জন্য কী প্রয়োজন
FreeBSD এবং Linux-এ ZFS এখন একই codebase, OpenZFS ব্যবহার করে। তাই দুই system-এই feature একই। ZFS চালানো একটি server checksummed data, data পরিবর্তন না হওয়া পর্যন্ত কোনো খরচ ছাড়াই snapshot, zfs send দিয়ে replication এবং একটি property পরিবর্তনের মাধ্যমেই compression দেয়। এর জন্য প্রয়োজন memory। ARC (adaptive replacement cache) default হিসেবে RAM-এর বড় অংশ ব্যবহার করে। 2 GB বা 4 GB VPS (virtual private server)-এ এই memory-ই আপনার application-এর প্রয়োজন হতে পারে।
এই guide-এ চল্লিশটি drive bay-যুক্ত storage box নয়, একটি বা দুটি virtual disk-সহ rented VPS থেকে ZFS মূল্যায়ন করা হয়েছে। এই পরিবেশে যে feature-গুলো কার্যকর থাকে, সেগুলোই আপনার সময় দেওয়ার উপযুক্ত। যে feature-গুলো এই পরিবেশে কার্যকর থাকে না, pool তৈরি করার আগে সেগুলো জানা জরুরি।
FreeBSD এবং Linux-এ OpenZFS: একটি codebase, দুটি packaging পদ্ধতি
FreeBSD 2008 সালে FreeBSD 7.0 থেকে base system-এর অংশ হিসেবে ZFS অন্তর্ভুক্ত করে আসছে। শুরুতে এটি experimental feature ছিল। OpenZFS 2.0 প্রকাশের পর, অর্থাৎ December 2020 থেকে, FreeBSD এবং Linux একই source tree থেকে build হয়। তাই zfs এবং zpool উভয় সিস্টেমেই একইভাবে কাজ করে, এবং এক সিস্টেমে তৈরি pool অন্য সিস্টেমে import করা যায়।
Linux-এ ZFS একটি package, আর FreeBSD-তে এটি base system-এর অংশ—এর কারণ licensing। OpenZFS CDDL (common development and distribution license)-এর অধীনে প্রকাশিত। Linux kernel GPL (general public license) version 2-এর অধীনে প্রকাশিত। Kernel project এই দুই license-কে incompatible হিসেবে বিবেচনা করে। তাই ZFS code mainline Linux-এ merge করা হয়নি, এবং প্রতিটি distribution নিজস্ব পদ্ধতিতে এটি সরবরাহ করে। FreeBSD-তে এমন কোনো conflict নেই, তাই ZFS সেখানে সরাসরি অন্তর্ভুক্ত থাকে। ব্যবহারিক দিক থেকে পুরো বিষয়টি এতটুকুই: packaging-এর একটি পার্থক্য, যার ভিত্তিতে আপনাকে কোনো পক্ষ বেছে নিতে হবে না।
SSD Nodes FreeBSD image সরবরাহ করে না। তাই এখানে ভাড়া নেওয়া server-এ এই guide-এর Linux অংশ প্রযোজ্য। আপনি অন্য কোথাও FreeBSD চালালে, একটি FreeBSD server-এ কোনো module build না করেই এবং kernel upgrade-এর সঙ্গে সামঞ্জস্য রাখার অতিরিক্ত ব্যবস্থা ছাড়াই ZFS পাওয়া যায়।
ZFS ইনস্টল করুন এবং একটি pool তৈরি করুন
Ubuntu-তে module-টি kernel package-এর মধ্যেই থাকে। তাই শুধু command-গুলো ইনস্টল করতে হবে।
sudo apt update
sudo apt install -y zfsutils-linux
zfs versionzfs version userland version এবং kernel module version—এই দুইটি line দেখায়। শুধু একটি line দেখা গেলে module load হয়নি। Package-টি universe component-এ থাকে। Ubuntu server image-এ এটি defaultভাবে enable করা থাকে। apt এটি খুঁজে না পেলে প্রথমে sudo add-apt-repository universe চালান।
Debian-এ package-গুলো contrib component-এ থাকে। DKMS (dynamic kernel module support) ব্যবহার করে module-টি আপনার machine-এ build হয়। /etc/apt/sources.list.d/debian.sources-এর Components: line-এ contrib যোগ করুন। এরপর sudo apt update চালিয়ে নিচের command দিন:
sudo apt install -y linux-headers-$(dpkg --print-architecture) zfs-dkms zfsutils-linuxইনস্টলেশনের সময় module compile হয় এবং Building initial module for 6.12.0-... প্রদর্শিত হয়। এতে কয়েক মিনিট লাগতে পারে। এর অর্থ মনে রাখুন: প্রতিটি kernel upgrade-এর পরে module আবার build হবে। Build ব্যর্থ হলে সমস্যা সমাধান না করা পর্যন্ত আপনার pool import করা যাবে না।
FreeBSD-তে কিছুই ইনস্টল করা থাকে না। Service-টি enable করে start করুন।
sysrc zfs_enable=YES
service zfs startএখন pool তৈরি করুন। প্রথমে স্থিতিশীল device path দেখুন। কারণ /dev/vdb detection order অনুযায়ী নাম দেয়। অন্য volume সংযুক্ত করলে এই নাম পরিবর্তিত হতে পারে।
ls -l /dev/disk/by-id/
sudo zpool create -o ashift=12 tank /dev/disk/by-id/virtio-abc123def456
zpool status tankzpool status-এ state: ONLINE প্রদর্শিত হওয়া উচিত। সেখানে আপনার device tank-এর অধীনে তালিকাভুক্ত থাকবে। ashift=12 pool-এর সর্বনিম্ন block size 4 KiB নির্ধারণ করে। এটি বর্তমান SSD-এর জন্য উপযুক্ত এবং pool তৈরির পরে পরিবর্তন করা যায় না।
বেশিরভাগ rented image ext4 root থেকে boot করে। তাই এখানে ZFS root filesystem নয়, দ্বিতীয় volume-এ থাকা data pool হিসেবে ব্যবহার করা হবে। Pool তৈরির আগে device-টি সঠিক কি না যাচাই করুন। কারণ আপনাকে দেওয়া NVMe disk নিশ্চিত করতে এক মিনিট লাগে, কিন্তু rebuild করতে পুরো বিকেল লাগতে পারে।
Checksums শুধু redundancy থাকা pool-এ repair করে
ZFS যে প্রতিটি block লেখে, তার সঙ্গে একটি checksum থাকে। প্রতিটি read-এর সময় checksum যাচাই করা হয়। Detection সব সময় কাজ করে। Repair-এর জন্য দ্বিতীয় copy প্রয়োজন।
একটি single-disk pool-এ ZFS আপনাকে সমস্যাটি জানায় এবং সেখানেই থেমে যায়। zpool status -v এটি এভাবে দেখায়:
status: One or more devices has experienced an error resulting in data
corruption.
action: Restore the file in question if possible. Otherwise restore the
entire pool from backup.
errors: Permanent errors have been detected in the following files:
/tank/data/archive.tarসমস্যাযুক্ত file-এর নাম দেখানো হয়। ext4 কোনো মন্তব্য ছাড়াই ওই bytes ফেরত দিত। তাই এটিও গুরুত্বপূর্ণ সুবিধা। তবে ZFS এটি ঠিক করতে পারে না, কারণ pool-এ ঠিক করার জন্য দ্বিতীয় কোনো copy নেই।
একটি mirror-এ একই read ভালো দিক থেকে দেওয়া হয়, খারাপ block পুনরায় লেখা হয়, এবং event-টি zpool status-এর CKSUM column-এ দেখা যায়। এটিই self-healing। এর জন্য দুটি device প্রয়োজন।
sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2VPS-এ host storage সাধারণত আগেই redundant থাকে। অনেক সময় hypervisor-এর অধীনে RAID 10 ব্যবহৃত হয়। এটি একটি drive নষ্ট হওয়া থেকে সুরক্ষা দেয়। তবে কোনো block ভুলভাবে ফিরে এলে এটি আপনাকে জানায় না, কারণ কোন copy সঠিক তা জানার উপায় array-এর নেই। ZFS তা জানে, কারণ এটি data-কে নিজের লেখা checksum-এর সঙ্গে তুলনা করে।
আপনার যদি একটি virtual disk থাকে এবং কিছু repair capability চান, sudo zfs set copies=2 tank/important ওই dataset-এর প্রতিটি block-এর দুটি copy একই disk-এ সংরক্ষণ করে। এতে dataset-টি যে space ব্যবহার করে তা দ্বিগুণ হয়, এটি bad block থেকে recover করতে পারে, কিন্তু পুরো volume অদৃশ্য হয়ে গেলে কোনো কাজ করে না।
একটি scrub pool-এর সব data পড়ে এবং তা যাচাই করে।
sudo zpool scrub tank
zpool status tankএকটি healthy pool-এর শেষে scan: scrub repaired 0B in 00:04:11 with 0 errors-এর মতো একটি line থাকে। এটি schedule-এ রাখুন। ছোট pool-এর জন্য মাসে একবার যথেষ্ট।
systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timerডেটাসেটই নীতির একক
একটি ডেটাসেট হলো pool-এর ভেতরের একটি filesystem। এটি তৈরি করতে বেশি খরচ হয় না, তাই প্রতিটি কাজের জন্য একটি করে ডেটাসেট তৈরি করুন। Property-গুলো pool থেকে নিচের স্তরে inherit হয়। তাই একটি default একবার সেট করুন এবং যেখানে প্রয়োজন সেখানে তা override করুন।
sudo zfs create tank/data
sudo zfs create tank/pg
sudo zfs set compression=lz4 tank
sudo zfs set atime=off tank
sudo zfs set quota=20G tank/data
sudo zfs set recordsize=16K tank/pg
zfs get -r compression,compressratio,quota tankCompression এমন একটি property, যা সতর্কতার কারণে অনেকে চালু করেন না। এটি ঠিক পদ্ধতি নয়। lz4 অল্প CPU ব্যবহার করে এবং disk-এ লিখতে হওয়া byte-এর পরিমাণ কমায়। তাই compressible data-এর ক্ষেত্রে এটি সাধারণত read ও write দ্রুত করে। zstd বেশি CPU ব্যবহার করে আরও শক্তভাবে compress করে। আপনি যেসব log ও archive খুব কম পড়েন, সেগুলোর জন্য এটি উপযোগী। zfs get compressratio tank ব্যবহার করে বাস্তবে কী ফল পাচ্ছেন তা পরীক্ষা করুন। মনে রাখবেন, ratio গণনায় শুধু property সেট করার পর লেখা data ধরা হয়।
recordsize হলো একটি ডেটাসেট যে সর্বোচ্চ block লিখতে পারে; default হিসেবে এটি 128K। একটি database 128 KiB record-এর মধ্যে 8 KiB page লিখলে, একটি ছোট write-এর জন্য পুরো record read, পরিবর্তন এবং আবার write করতে হয়। Data load করার আগে database dataset-এ recordsize=16K সেট করুন, কারণ এই property শুধু পরে লেখা নতুন block-এর ক্ষেত্রে প্রযোজ্য।
quota ব্যবহার করে একটি ডেটাসেটকে pool পূর্ণ করে ফেলা থেকে আটকানো যায়। 100% পূর্ণের কাছাকাছি ZFS pool ধীর হয়ে যায় এবং পরিষ্কার করা কঠিন হয়। তাই ইচ্ছাকৃতভাবে কিছু headroom রেখে দিন।
Snapshots ডেটা পরিবর্তন না হওয়া পর্যন্ত কোনো অতিরিক্ত স্থান ব্যবহার করে না
ZFS কখনও ব্যবহৃত block সরাসরি overwrite করে না। এটি একটি নতুন block লেখে এবং pointer আপডেট করে। এটিই copy-on-write-এর অর্থ। Snapshot এমন একটি নির্দেশনা, যার অর্থ হলো “এই মুহূর্তে dataset যে block-গুলোর দিকে নির্দেশ করছে, সেগুলো সংরক্ষণ করো।” তাই snapshot নেওয়া তাৎক্ষণিক এবং বিনামূল্যে।
sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/dataSnapshot-এর USED column-এ শুধু ওই snapshot ধরে রাখা স্থান দেখানো হয়। শুরুতে এর মান প্রায় শূন্য থাকে। আপনি data পরিবর্তন বা মুছে ফেললে এটি বাড়ে, কারণ পুরোনো block আর মুক্ত করা যায় না।
কোনো file ফিরিয়ে আনতে restore ধাপের প্রয়োজন হয় না।
ls /tank/data/.zfs/snapshot/
cp /tank/data/.zfs/snapshot/2026-08-11/notes.txt /tank/data/notes.txt.zfs directory-টি ls -a-এর কাছেও hidden থাকে, যতক্ষণ না আপনি sudo zfs set snapdir=visible tank/data চালান। প্রয়োজনের আগেই snapshot নিন। কারণ snapshot না থাকলে একটি ভুল rm -rf আপনাকে ext4 recovery path-এ পাঠিয়ে দেয়, যেখানে প্রথমে disk unmount করতে হয় এবং এরপর পরিস্থিতি আরও জটিল হয়।
Rollback snapshot নেওয়ার পর থেকে লেখা সব data বাতিল করে দেয়।
sudo zfs rollback tank/data@2026-08-11নতুন snapshot থাকলে এটি কাজ করতে অস্বীকার করে। এগিয়ে যেতে -r সেই নতুন snapshot-গুলো ধ্বংস করে। Enter চাপার আগে dataset-এর নাম দুবার যাচাই করুন।
একটি snapshot backup নয়। এটি একই pool, একই volume এবং একই server-এ থাকে। কোনো volume ব্যর্থ হলে বা একটি zpool destroy ঘটলে data-এর সঙ্গে snapshot-ও হারিয়ে যায়। Snapshot আপনার নিজের rm এবং ভুল upgrade থেকে সুরক্ষা দেয়। বাস্তবের অনেক incident এতে সামাল দেওয়া যায়। কিন্তু pool-এর নিজস্ব কোনো সমস্যার বিরুদ্ধে এটি সুরক্ষা দেয় না। সম্পূর্ণ ব্যাখ্যা এখানে রয়েছে: কেন VPS snapshot backup নয়।
পাঠানো ও গ্রহণ: একটি কমান্ডে replication
zfs send একটি snapshot-কে standard output-এ byte stream-এ রূপান্তর করে, আর zfs receive সেই stream-কে আবার dataset-এ রূপান্তর করে। প্রথম copy একটি full send।
sudo zfs snapshot tank/data@daily-2026-08-11
sudo zfs send tank/data@daily-2026-08-11 | ssh backup.example.com "sudo zfs recv -F backup/data"এরপর দুটি snapshot-এর মধ্যে যা পরিবর্তিত হয়েছে, শুধু সেটুকু পাঠান।
sudo zfs snapshot tank/data@daily-2026-08-12
sudo zfs send -i tank/data@daily-2026-08-11 tank/data@daily-2026-08-12 | ssh backup.example.com "sudo zfs recv backup/data"যে snapshot থেকে পাঠাচ্ছেন, receiving side-এ সেটি থাকতেই হবে। না থাকলে receive cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source দিয়ে থেমে যায়, কারণ পার্থক্য প্রয়োগ করার জন্য ZFS-এর কাছে কোনো base থাকে না। উভয় পাশে থাকা কোনো snapshot থেকে পাঠান, অথবা full send দিয়ে আবার শুরু করুন।
remote root ব্যবহার না করে target-এ অধিকার দিন: sudo zfs allow -u backupuser create,mount,receive backup/data।
এটি একটি বাস্তব off-site backup, তবে একটি শর্ত আছে। দূরের প্রান্তটি অবশ্যই একটি ZFS pool হতে হবে, কারণ object storage stream গ্রহণ করতে পারে না। আপনার target যদি S3-compatible storage বা সাধারণ Linux host হয়, তাহলে সেটির সঙ্গে যোগাযোগ করতে পারে এমন tool ব্যবহার করুন। সেই পদ্ধতির জন্য VPS থেকে restic backup দেখুন।
ZFS এত RAM ব্যবহার করে কেন? ARC
ARC (adaptive replacement cache) হলো ZFS-এর read cache। এটি সাধারণ Linux page cache-এ না থেকে kernel memory-তে থাকে, তাই free -h এটিকে buff/cache-এর অধীনে দেখায় না। এটি ব্যবহৃত memory হিসেবে গণনা হয়। প্রায় সম্পূর্ণ ভরা মনে হওয়া ZFS server সাধারণত warm cache-সহ server, এবং অধিকাংশ “ZFS আমার RAM খেয়ে ফেলেছে” প্রতিবেদনের কারণ এটিই।
ডিফল্ট limit ইচ্ছাকৃতভাবে উদার। OpenZFS 2.3 সর্বোচ্চ ARC size হিসেবে RAM থেকে 1 GiB কম এবং RAM-এর 5/8 অংশের মধ্যে যেটি বড়, সেটি নির্ধারণ করে। OpenZFS 2.2 এবং তার আগের সংস্করণ Linux-এ RAM-এর অর্ধেক ব্যবহার করত, আর FreeBSD আগেই নতুন নিয়ম ব্যবহার করত। আপনার ক্ষেত্রে কোন নিয়ম প্রযোজ্য তা দেখতে zfs version চালান।
The data behind this chart
[
{
"label": "2 GB VPS",
"openzfs_2_2_linux_gib": 1,
"openzfs_2_3_gib": 1.25
},
{
"label": "4 GB VPS",
"openzfs_2_2_linux_gib": 2,
"openzfs_2_3_gib": 3
},
{
"label": "8 GB VPS",
"openzfs_2_2_linux_gib": 4,
"openzfs_2_3_gib": 7
},
{
"label": "16 GB VPS",
"openzfs_2_2_linux_gib": 8,
"openzfs_2_3_gib": 15
}
]এই পরিসংখ্যানগুলো সাধারণ instance size-এ প্রয়োগ করা নথিভুক্ত default rule-এর ফল; চলমান server থেকে নেওয়া measurement নয়। 4 GB instance-এ 2.3-এর নিয়মে ARC সর্বোচ্চ 3 GiB হতে পারে। একই server 2.2-এ 2 GiB-এ থামে। 2.3-এর নিয়মে 2 GB instance-এও ARC 1.25 GiB পর্যন্ত যেতে পারে। বাকি memory আপনার application পায়।
Table-এর ওপর নির্ভর না করে নিজের server থেকে প্রকৃত সংখ্যাগুলো দেখুন:
grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20তৃতীয় column-এ bytes দেখানো হয়। c_max হলো বর্তমানে কার্যকর ceiling, আর size হলো ARC বর্তমানে যতটা memory ধরে রেখেছে।
ARC memory ফিরিয়ে দেয়। Kernel memory pressure signal করলে ARC ছোট হয়। সমস্যা হলো timing। এই shrink pressure-এর মাধ্যমে চালিত হয়। তাই কোনো process একসঙ্গে কয়েক শত MiB চাইলে ARC ছাড়ার প্রক্রিয়া চলার সময় OOM (out of memory) killer-এর মুখোমুখি হতে পারে। Database এবং web server চালানো 2 GB server-এ এটি বিরল ঘটনা নয়। OpenZFS manual-এ manual পরিবর্তন সম্পর্কেও একই কথা বলা হয়েছে: limit কমালে “shrink করার জন্য memory pressure তৈরি না হলে ARC ছোট হবে না”।
ছোট VPS-এ ARC-এর সর্বোচ্চ সীমা কীভাবে নির্ধারণ করবেন
প্রথমে workload-এর memory চাহিদা নির্ধারণ করুন। Database এবং application-এর প্রয়োজনীয় memory যোগ করুন, operating system-এর জন্য কিছু margin রাখুন, এবং অবশিষ্ট memory ARC-কে দিন। Postgres এবং একটি web application চালানো 4 GB instance-এ 512 MiB থেকে 1 GiB ARC দিয়ে শুরু করা যুক্তিসংগত।
চলমান সিস্টেমে সীমাটি bytes-এ নির্ধারণ করুন। এখানে সীমাটি 1 GiB।
echo 1073741824 | sudo tee /sys/module/zfs/parameters/zfs_arc_maxReboot-এর পরেও সেটিংটি কার্যকর রাখুন।
echo 'options zfs zfs_arc_max=1073741824' | sudo tee /etc/modprobe.d/zfs.conf
sudo update-initramfs -uinitramfs ধাপটি গুরুত্বপূর্ণ। কারণ root filesystem mount হওয়ার আগেই module initramfs থেকে load হতে পারে। সে ক্ষেত্রে module আপনার সদ্য লেখা file পড়বে না। Reboot-এর পরে arcstats-এর c_max line দেখে সেটিংটি নিশ্চিত করুন।
Manual থেকেই দুটি সতর্কতা জানা যায়। সিস্টেম চলার সময় value আবার 0 করা যায় না। তাই সেটিং বাতিল করতে file সম্পাদনা করে reboot করতে হবে। আর number কমালেও বড় ARC সঙ্গে সঙ্গে ছোট হয় না।
FreeBSD-তে একই সীমা vfs.zfs.arc-এর অধীনে একটি sysctl হিসেবে নির্ধারণ করা হয়। বর্তমান value এবং আপনার version-এ ব্যবহৃত সঠিক নাম দেখতে sysctl vfs.zfs.arc চালান। এরপর সর্বোচ্চ value /boot/loader.conf-এ লিখুন।
ছোট server-এর জন্য memory-সংক্রান্ত আরও দুটি নিয়ম মনে রাখুন। Deduplication বন্ধ রাখুন। কারণ dedup table memory-তে থাকে, এবং প্রচলিত হিসাব অনুযায়ী প্রতি TB unique data-এর জন্য 1 থেকে 3 GB RAM প্রয়োজন হতে পারে। এছাড়া zvol-এ swap রাখবেন না। zvol হলো pool থেকে তৈরি করা একটি block device। Memory মুক্ত করার চেষ্টা করা filesystem-এর মাধ্যমেই swap চালালে machine deadlock করতে পারে। Swap একটি সাধারণ partition-এ অথবা pool-এর বাইরে থাকা swap file-এ রাখুন।
ext4 বা XFS এবং restic কখন ভালো পছন্দ
অতিরিক্ত memory এবং দ্বিতীয় volume থাকা সার্ভারে ZFS তার সুবিধা দেখায়। এর বাইরে সাধারণ filesystem-এর সঙ্গে প্রকৃত backup tool ব্যবহার করাই ভালো। নিচের পরিস্থিতিতে ext4 বা XFS বেছে নিন:
- Instance-এ 2 GB বা 4 GB RAM আছে এবং workload-এর জন্য পুরো memory প্রয়োজন।
- একটি virtual disk আছে এবং দ্বিতীয় কোনো copy নেই। তাই ZFS data corruption শনাক্ত করতে পারলেও তা মেরামত করতে পারে না।
- আপনার backup target object storage বা সাধারণ Linux host। তাই সেখানে কোনো কিছুই
zfs sendstream গ্রহণ করতে পারে না। - আপনি DKMS-সহ Debian চালাচ্ছেন এবং এমন kernel upgrade করার সুযোগ নেই, যার পরে module build না-ও হতে পারে।
- Root filesystem-এ ZFS প্রয়োজন, কিন্তু provider-এর image-গুলোতে শুধু ext4 দেওয়া আছে।
আলাদা data volume, পর্যাপ্ত RAM (8 GB বা তার বেশি হলে স্বচ্ছন্দে চলে) এবং snapshots ও zfs send ব্যবহার করে এমন একটি পরিকল্পনা থাকলে ZFS রাখুন; শুধু এগুলো enable করলেই হবে না। অন্য সব ক্ষেত্রে ext4-এর সঙ্গে restic ব্যবহার করুন। restic encrypted ও deduplicated backup এমন storage-এ লিখবে, যা সার্ভার নিয়ন্ত্রণ করে না। এতে memory ব্যবহারের সামান্য অংশে একই ধরনের অধিকাংশ সুবিধা পাওয়া যায়।
ত্রুটির ধরন এবং আপনি যে স্ট্রিংগুলো দেখবেন
Reboot-এর পরে pool আর নেই। zpool status চালালে no pools available দেখা যায়। Import service /etc/zfs/zpool.cache পড়ে, তাই ওই ফাইলে না থাকা pool boot-এর সময় কখনো import হয় না। কোনগুলো import করা যায় তা sudo zpool import দেখায়, sudo zpool import tank pool ফিরিয়ে আনে, এবং sudo zpool set cachefile=/etc/zfs/zpool.cache tank পরিবর্তনটি স্থায়ী করে। অন্য কোনো system থেকে cleanly export না করা pool-এর ক্ষেত্রে cannot import 'tank': pool may be in use from other system দেখা যায়। অন্য কোনো host-এ pool-টি নেই নিশ্চিত হলে sudo zpool import -f tank সেটি override করে।
Debian-এ kernel upgrade-এর পরে modprobe: FATAL: Module zfs not found in directory /lib/modules/6.12.0-...। DKMS নতুন kernel-এর জন্য build করেনি। সাধারণত matching headers install না থাকলে এটি ঘটে। কোন kernel-এর জন্য কী build হয়েছে তা dkms status দেখায়। এরপর sudo apt install -y linux-headers-$(uname -r) দিয়ে sudo dkms autoinstall এটি rebuild করে, এবং sudo zpool import tank pool ফিরিয়ে আনে।
আপনি file মুছে ফেলেছেন, কিন্তু pool full। কোনো snapshot এখনও deleted data reference করলে সেই data disk-এ থেকে যায়। তাই du এবং df-এর ফল আলাদা হয়। zfs list -o space -r tank usage-কে USEDDS এবং USEDSNAP-এ ভাগ করে দেখায়। বড় USEDSNAP-ই সমস্যার কারণ নির্দেশ করে। sudo zfs destroy tank/data@2026-06-01 দিয়ে পুরনো snapshot ধ্বংস করুন। এরপর space ফিরে আসবে।
zpool status-এ CKSUM-এর সংখ্যা বাড়ছে। ZFS-এর নিচের কোনো স্তর ভুল data ফেরত দিয়েছে। Mirror-এ এটি একটি warning, এবং block-টি repair করা হয়েছে। Single-disk pool-এ file-টি হারিয়ে যায়। zpool status -v file-টির নাম দেখায়। এরপর এই pool-এ না থাকা backup থেকে শুধু ওই file-টি restore করুন।
Server ধীর এবং swapping করছে। উপরের পদ্ধতিতে ARC-এর সীমা নির্ধারণ করুন। এরপর arc_summary চালিয়ে hit ratio দেখুন। Working set ধরে রাখার জন্য ARC খুব ছোট হলে প্রতিটি read disk-এ যায়। এই অবস্থায় page cache ব্যবহার করা সাধারণ filesystem আপনার জন্য বেশি কার্যকর হবে।
FAQ
VPS-এ ZFS-এর কত RAM প্রয়োজন?
ZFS 2 GB-এর instance-এ চলে। আসল প্রশ্ন হলো, আপনার application-এর জন্য কত RAM অবশিষ্ট থাকে। কোনো tuning না করলে OpenZFS 2.3 ARC-কে RAM থেকে 1 GiB বাদ দেওয়া মান এবং RAM-এর 5/8 অংশের মধ্যে যেটি বড়, সেই সীমা পর্যন্ত বাড়তে দেয়। তাই 4 GB-এর একটি server cache-এর জন্য 3 GiB দিতে পারে। আপনার workload যতটা RAM ছাড়তে পারে, zfs_arc_max-এ সেই মান সেট করুন। এরপর /proc/spl/kstat/zfs/arcstats থেকে c_max line পড়ে তা নিশ্চিত করুন।
ZFS snapshot কি backup?
না। Snapshot data-এর একই pool-এ থাকে। এটি খারাপ rm এবং ব্যর্থ upgrade-এর পরেও থাকে, কিন্তু pool বা instance নষ্ট হলে snapshot-ও নষ্ট হয়। zfs send ব্যবহার করে snapshot অন্য machine-এ পাঠালে, অথবা এই server যে storage নিয়ন্ত্রণ করে না সেখানে data লেখে এমন backup tool চালালে, সেটিকে backup-এ পরিণত করা যায়।
FreeBSD এবং Linux-এ ZFS কি একইভাবে কাজ করে?
December 2020-এর OpenZFS 2.0 থেকে একই codebase ব্যবহৃত হচ্ছে। Commands একই, on-disk format একই, এবং pool দুই platform-এর মধ্যে স্থানান্তর করা যায়। পার্থক্যটি packaging-এ। FreeBSD base system-এ ZFS সরবরাহ করে। Linux-এ প্রতিটি distribution আলাদা সিদ্ধান্ত নেয়: Ubuntu তার kernel packages-এর মধ্যে module তৈরি করে, আর Debian DKMS ব্যবহার করে আপনার machine-এ module তৈরি করে। তাই kernel upgrade-এর পরে rebuild সফল না হওয়া পর্যন্ত module অনুপস্থিত থাকতে পারে।
এক disk-যুক্ত VPS-এ ZFS কি corruption মেরামত করতে পারে?
ZFS corruption শনাক্ত করে এবং file-এর নাম জানায়। কিন্তু এটি corruption মেরামত করতে পারে না, কারণ মেরামতের জন্য block-এর দ্বিতীয় একটি copy প্রয়োজন। একটি dataset-এ zfs set copies=2 চালু করলে দ্বিগুণ storage ব্যবহারের বিনিময়ে সেই দ্বিতীয় copy পাওয়া যায়। এতে bad block সামলানো যায়, কিন্তু হারিয়ে যাওয়া volume পুনরুদ্ধার করা যায় না। দুইটি volume জুড়ে mirror ব্যবহার করলেই প্রকৃত repair সম্ভব।
Compression কি server ধীর করে?
lz4 সাধারণত server-কে দ্রুত করে। Compressed block-এর কারণে কম byte write এবং read করতে হয়। প্রতি block-এ CPU cost যে disk I/O সাশ্রয় হয় তার তুলনায় কম। pool root-এ compression=lz4 সেট করুন, যাতে প্রতিটি dataset এটি inherit করে। এরপর বাস্তব data লেখার পরে একবার zfs get compressratio tank পরীক্ষা করুন।