# ফাইলসিস্টেম টেস্ট এবং রিপেয়ার করা

## fsck

ফাইলসিস্টেমে স্বয়ংক্রিয়ভাবে সমস্যা নির্ণয় এবং তার সমাধান করার জন্য লিনাক্সে `fsck` ব্যবহার করা হয়। হার্ডওয়্যার এর ত্রুটিতে বিভিন্নরকম ডাটা করাপশনে এটি বেশ কাজে লাগে। উদ্ধারকৃত ফাইলসমূহ ওই ড্রাইভের lost+found ফোল্ডারে পাওয়া যায়।

যদি আমরা sdb1 ড্রাইভে fsck ব্যবহার করতে চাই তাহলে আমাদের কমান্ড হবে:

```
# umount /dev/sdb1
# fsck /dev/sdb1
```

তাছাড়াও সিস্টেমের ড্রাইভগুলো যেগুলো আপনি সিস্টেম চালু অবস্থায় আনমাউন্ট করে টেস্ট করতে পারছেন না সেগুলোকে কম্পিউটার চালুর সময় আমরা চেক করতে পারি রুট ডিরেক্টরিতে forcefsck নামে একটা ফাঁকা ফাইল তৈরী করে। সেক্ষেত্রে পরবর্তীবার কম্পিউটার চালু হওয়ার সময় fsck টেস্ট করবে।

```
# touch /forcefsck
```

## চেকসাম (checksum)

চেকসাম একধরনের ডাটা ইন্টিগ্রিটি পরীক্ষা করার উপায়। কোনো ফাইলের উপর বিশেষ গাণিতিক বিশ্লেষণ চালিয়ে চেকসামের একটি সংখ্যামান পাওয়া যায়। সেই তথ্যের একটি বিটও যদি এদিক-ওদিক হয় তবে চেকসাম মিলবে না। বিভিন্ন জায়গা থেকে ডাউনলোড করার সময় আপনি চেকসাম তথ্য পাবেন। যা দিয়ে আপনি ডাউনলোড করা ফাইলটি ঠিক আছে কিনা দেখতে পারেন। মনে করেন আপনি image.iso নামে একটি ফাইল ডাউনলোড করেছেন এবং তার md5sum (চেকসামের একটি ধরণ) সংখ্যাটিও পেয়েছেন। এবার আপনি নীচের কমান্ডটি দেবেন:

```
me@howtocode-pc:~$ md5sum image.iso
```

এবার আপনি image.iso এর চেকসাম সংখ্যা পাবেন। আপনি তখন দুটি সংখ্যা মিলিয়ে দেখতে পারবেন ফাইলটিঠিক আছে কিনা।

চেকসামের আরেকটা গুরুত্বপূর্ণ ব্যবহার হল নতুন রাইট করা সিডি/ডিভিডির ডাটা ইন্টিগ্রিটি পরীক্ষা করা। তবে এক্ষেত্রে একটা জিনিস মনে রাখতে হবে যে আমরা সিডি বা ডিভিডির ততটুকুই ধর্তব্যে আনবো যতটা রাইট করা হয়েছে, পুরো সিডি/ডিভিডিটা নয়। অধিকাংশক্ষেত্রে যেমন ডিস্ক-এ্যাট-ওয়ান্স মোডে রাইট করা সিডির ক্ষেত্রে এটি নিয়ে আপনাকে ভাবে হবে না। image.iso নামে একটি ইমেজ সিডিতে রাইট করার পর চেকসাম পরীক্ষা করতে কমান্ডটি হবে:

```
me@howtocode-pc:~$ md5sum image.iso; md5sum /dev/sr0
```

কমান্ডটি দিলে, প্রথম লাইনে ইমেজের ও দ্বিতীয় লাইনে সিডির চেকসাম দেখাবে। যার ফলে আপনি সহজে মিলিয়ে দেখতে পারবেন।

কিন্তু ডিভিডির ক্ষেত্রে আপনাকে আরেকটু কসরত করতে হবে। কমান্ডটি হবে এরকম:

```
me@howtocode-pc:~$ md5sum image.iso; dd if=/dev/sr0 bs=2048 count=$(( $(stat -c "%s" image.iso) / 2048 )) | md5sum
```

রীতিমত ভয়ঙ্কর দেখাচ্ছে কি? আসুন, ভেঙে দেখা যাক:

* **md5sum image.iso;**: এটুকু দিয়ে আমরা image.iso এর চেকসাম দেখলাম।
* **dd**: আমরা `dd` কমান্ড ব্যবহার করছি ডিভিডিটি পড়তে।
* **if=/dev/sr0**: `dd` কমান্ডের ইনপুট হিসেবে আমরা ডিভিডির ডিভাইসটি দিয়েছি।
* **bs=2048**: আমরা `dd`কে একেকবারে 2048 বাইট করে পড়তে বলছি। সিডি/ডিভিডি সবসময় 2048 বাইটের ব্লকে রাইট করা হয়।
* **count=$(( $(stat -c "%s" image.iso) / 2048 ))**: আমরা কতগুলো ব্লক পড়তে হবে তা বলছি। এটি একটু জটিল। এর অংশগুলো এরকম:
  * **$(stat -c "%s" image.iso)**: আমরা একটি কমান্ড সাবস্টিটিউশন ব্যবহার করছি। এই কমান্ডটি দিয়ে সম্পুর্ণ ইমেজটিকে বাইটের সাইজে দেখাবে। অর্থাৎ কমান্ডের এই অংশ একটি সংখ্যায় রূপান্তরিত হবে।
  * **$(( $(stat -c "%s" image.iso) / 2048 ))**: এটি একটি গাণিতিক এক্সপ্যানসন। `$(stat -c "%s" image.iso)` দিয়ে যে সংখ্যাটি পাওয়া যাবে সেটিকে 2048 দিয়ে ভাগ করবে। ফলে কাউন্টের জন্য সেই ব্লক সংখ্যার পরিমাণ পাওয়া যাবে।
* **| md5sum**: সবশেষে `dd` দিয়ে পড়া তথ্যের চেকসাম বের করতে আমরা প্রাপ্ত আউটপুটকে পাইপ দিয়ে `md5sum` এ পরিচালিত করেছি।
