ড্রাইভের অব্যবহৃত স্থান ট্রিমের উপযোগিতা


11

আমার কয়েকটি এক্সট 4 পার্টিশন সহ একটি ড্রাইভ (এসডি কার্ড) রয়েছে তবে কিছু অবিকৃত স্থান নেই। fstrimইউটিলিটি কেবল একটি ফাইল সিস্টেমের মধ্যেই কাজ করতে পারে। আমি চাকাটি পুনর্নবীকরণ এবং একটি লেখার আগে, এমন কি আরও কোনও ইউটিলিটি রয়েছে যা অব্যক্ত স্থানটি ট্রিম করতে পারে (বা এটি স্পষ্টভাবে নির্দিষ্ট রেঞ্জটি ট্রিম করতে পারে)?

আমি যাচাই করতে পারি যে ডিভাইসে অব্যবহৃত স্থানের বেশিরভাগ অংশটি বর্তমানে নিয়ামক দ্বারা মুক্ত বলে জানা যায় নি , যেমন আমি দেখেছি যে এই নির্দিষ্ট কার্ডে, ছাঁটাই করা স্থানটি 0 পড়তে পাঠায়, তবে ডিভাইসের স্ক্যানটি দেখায় প্রচুর আবর্জনা ডেটা বাকি আছে।

সম্পাদনা: ব্যবহার করে আমার একটি সমস্যা হচ্ছে hdparm। নীচের উদাহরণটি প্রথম ক্ষেত্রটিকে বাতিল করে দেয় তবে আমি নির্ধারিত পরিসর নির্বিশেষে একই ফলাফলগুলি দেখছি। fstrimডিভাইসে কোনও সমস্যা নেই:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

আমি আরও তদন্ত করছি তবে কারও কি অন্তর্দৃষ্টি আছে?


1
আপনি যদি এক বা একাধিক পার্টিশন (অস্থায়ীভাবে) দিয়ে অবিভাজনিত স্থানটি মানচিত্র করেন তবে আপনি blkdiscardতাদের ব্যবহার করতে পারেন যা পুরো ডিভাইসকে ছাঁটাই করে।
frostschutz

ধন্যবাদ! এটি সঠিক সরঞ্জামের মতো দেখায়, তবে blkdiscardআমার মানক প্যাকেজ সংগ্রহস্থলগুলিতে এটি উপলভ্য বলে মনে হয় না (উবুন্টু 12.04, এতে উপস্থিত বলে মনে হচ্ছে না util-linux)।
জেসন সি

আমি কখনই hdparmকোনও কারণে আমার পক্ষে কাজ করতে সক্ষম হইনি , তবে আমি github.com/karelzak/util-linux/tree/stable/v2.23 থেকে ইউট -লিনাক্স উত্সটি পেয়েছি , এটি তৈরি করেছি ( ./autogen.sh ; ./configure ; make blkdiscard) এবং এটি দুর্দান্ত কাজ করছে। এখনও রহস্যযুক্ত hdparmকিন্তু blkdiscardআমি যা চাই ঠিক তাই করে। বোনাস: প্রথমে একটি অস্থায়ী ফাইল সিস্টেম তৈরি করার দরকার নেই, আপনি sfdisk -lপার্টিশনের মধ্যে স্থান নির্ধারণ করতে এবং blkdiscardএটি ছাঁটাতে ব্যবহার করতে পারেন ।
জেসন সি

ওহ, আমি blkdiscardঅফসেট / দৈর্ঘ্যের বিকল্পগুলির সাথে কাজ করতে সক্ষম হওয়া সম্পর্কে সচেতন ছিলাম না । সুতরাং আমি প্রস্তাবিত অস্থায়ী পার্টিশনগুলি এমনকি প্রয়োজনীয় নয়। নিস!
frostschutz

উত্তর:


16

আপনার যদি সাম্প্রতিক পর্যায়ে যথেষ্ট সংস্করণ util-linuxথাকে তবে এটিতে এমন সরঞ্জাম রয়েছে blkdiscardযা পুরো ডিভাইসগুলি ট্রিম করতে সক্ষম হয়, বা ডিভাইসের মধ্যে ব্যাপ্তিগুলি --offsetএবং --lengthবিকল্পগুলি ব্যবহার করে ।

দয়া করে নোট করুন: blkdiscard বিপজ্জনক, যদি আপনি এটি ভুল অঞ্চলগুলিতে ট্রিম করতে দেন তবে আপনার ডেটা চলে গেছে!

সুতরাং আপনি নিজের পার্টিশন টেবিলের অবিভাজনযুক্ত (মুক্ত) অঞ্চলগুলি বের করতে পারেন এবং তারপরে এই সরঞ্জামটি ব্যবহার করে তাদের ট্রিম করতে পারেন। পার্টিশনগুলির জন্য msdosএবং এর জন্য ফ্রি অঞ্চলগুলি সরবরাহ করে:gptparted

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

এটিতে একটি লুপ যুক্ত করুন ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

যা প্রিন্ট করে

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

এই আউটপুটটি আপনার জন্য সঠিক কিনা তা যাচাই করুন, আপনি পছন্দ করলে অতিরিক্ত বিকল্প যুক্ত করুন (ভার্বোস?), এবং অবশেষে অপসারণ করুন echoযাতে এটি বাস্তবায়িত হবে, এবং আপনাকে সেট করা উচিত।

উদাহরণের দ্বিতীয় কমান্ডটি আসলে ব্যর্থ হয় কারণ দৈর্ঘ্য খুব কম - এটি লুপের ভিতরে যাচাই করতে পারে, 1MB এর চেয়ে ছোট অঞ্চলগুলিকে অগ্রাহ্য করতে পারে কারণ তাদের সফলভাবে ছাঁটাই হওয়ার সম্ভাবনা নেই're


আপনি যদি পার্টিশনের পরিবর্তে LVM ব্যবহার করে থাকেন তবে আপনি অনাবৃত স্থানের জন্য একটি এলভি তৈরি করতে পারেন এবং এটি ছাঁটাতে পারেন:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

যদি আপনি এটি সেট issue_discards = 1করেন তবে আপনি কলটি lvm.confএড়িয়ে যেতে পারেন blkdiscardযেহেতু এলভিএম lvremoveনিজেই নিজেই টিআআআআরএম জারি করবে ।


1
ধন্যবাদ! আমি এটিকে উত্তর হিসাবে মন্তব্য করেছি কারণ এটি আমার পক্ষে কাজ করছে, যদিও মাইকের উত্তরটিও বৈধ। এছাড়াও আমি প্রশ্ন মন্তব্যে যা বলেছিলাম তা যুক্ত করব: আপনার যদি উপলব্ধ না থাকে blkdiscard; আপনি github.com/karelzak/util-linux/tree/stable/v2.23 থেকে ইউজ -লিনাক্স উত্সটি ধরে নিতে পারেন তবে বিল্ড blkdiscard(রান ./autogen.sh ; ./configure ; make blkdiscard) করুন - এটি পরিষ্কারভাবে তৈরি করা হয়েছে (যদিও আপনাকে কিছুটা নির্ভরশীলতা এবং টুইঙ্ক configureঅপশন ইনস্টল করতে হতে পারে ) এবং হিসাবে যতক্ষণ আপনি এটি ইনস্টল করবেন না, এটি বিদ্যমান ইউজ-লিনাক্সের সাথে বিরোধ নয়।
জেসন সি

1
আমি নির্দিষ্ট মানগুলিকে পাশ করার ক্ষেত্রেও ব্যর্থতা পর্যবেক্ষণ করছিলাম blkdiscardতবে লক্ষ্য করেছি মানগুলি অফসেটের উপর ভিত্তি করে, দৈর্ঘ্যের উপর নির্ভর করে না। এটিতে কোনও সমস্যা আছে এটি সম্ভব blkdiscard, আমি তদন্তের প্রক্রিয়াধীন। Unix.stackexchange.com/questions/98473/…
জেসন সি

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা সমস্ত মাউন্ট করা ফাইল সিস্টেমে ফ্রি স্পেস পাশাপাশি বিনামূল্যে এলভিএম
ভিজিগুলিকে

7

hdparm --trim-sector-rangesএকটি পরিসীমা ছাঁটাই করতে পারেন। ম্যান পৃষ্ঠাটি এটি ব্যবহার করার জন্য সতর্ক করে, তাই আপনি আরও সঠিকভাবে নিশ্চিত হন যে আপনি সঠিক পরিসর এবং বাক্য গঠনটি পেয়েছেন।

আমি মনে করি পার্টিশনের বাইরের সমস্ত ডেটার জন্য একটি ট্রিম প্রেরণ করা বিপজ্জনক হবে, কারণ এখানে কিছু লুকানো ডেটা রয়েছে যেমন কখনও কখনও বুটলোডার কোড বা দ্বিতীয় বিভাজন সারণী। আপনার এক্সটলিটি জানতে হবে, পার্টিশনের বাইরের অঞ্চলগুলি সত্যই অব্যবহৃত।


পারফেক্ট, ধন্যবাদ! আমি ডিভাইসটির আকারটি ব্যবহার করতে পারি না hdparm, অব্যবহৃত পরিসীমা থেকে sfdiskএবং সেই অনুযায়ী ছাঁটাতে পারি। আমি জানি ড্রাইভে কি আছে যদি কোনও পার্টিশন স্কিম থাকে যা অ্যাক্সেসযোগ্য তবে অবিকল্পিত অঞ্চলে ডেটা লুকিয়ে রাখে তবে কোনও পার্টিশন সম্পাদকের প্রাথমিক কার্যকারিতা ভঙ্গ হবে। আমি অনুমান করি (আশা করি) এরকম কোনও পরিকল্পনা দীর্ঘদিন পরিত্যক্ত ছিল (যদিও আমি আমার মাথার উপরের দিক থেকে কিছুই জানি না)। আমার জানা সমস্ত স্কিমগুলি ডিভাইসের শুরুতে এমবিআর সুপরিচিত অবিকৃত স্থানে এবং বরাদ্দকৃত পার্টিশনের মধ্যে ভিবিআর / ইবিআর সংরক্ষণ করে। পুরানো অস্পষ্ট পরিকল্পনা থাকতে পারে যা আলাদা। :)
জেসন সি

আমার কিছুটা সমস্যা হচ্ছে hdparm, আমি আমার প্রশ্নটি বিশদ সহ সম্পাদনা করেছি; আপনার কোনও অন্তর্দৃষ্টি আছে কিনা তা ভাবছি।
জেসন সি

1
মনে হচ্ছে কমপক্ষে এইচডিপিআরমে কিছু / dev / mmcblk0 এ কাজ করে না। দুঃখিত, আমার আর কোনও ধারণা নেই।
মাইকেল Suelmann
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.