टीआरआईएम की उपयोगिता ड्राइव पर बिना स्पेस वाली जगह है


11

मेरे पास एक ड्राइव (एसडी कार्ड) है जिसमें कुछ अतिरिक्त 4 विभाजन हैं, लेकिन कुछ असंबद्ध स्थान भी हैं। fstrimउपयोगिता केवल एक फाइल सिस्टम के भीतर काम कर सकते हैं। इससे पहले कि मैं पहिए को फिर से लगाऊं और एक लिखूं, क्या कोई और उपयोगिता है जो असंबद्ध स्थान को TRIM कर सकती है (या जो TRIM को स्पष्ट रूप से निर्दिष्ट सीमा दे सकती है)?

मैं यह सत्यापित कर सकता हूं कि डिवाइस पर मौजूद अधिकांश असंबद्ध स्थान को वर्तमान में नियंत्रक द्वारा मुक्त होने के लिए नहीं जाना जाता है, जैसा कि मैंने देखा है कि इस विशेष कार्ड पर, छंटनी की गई स्पेस रिटर्न 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उन पर उपयोग कर सकते हैं जो पूरे डिवाइस को ट्रिम करता है।
19:30 पर फ्रॉस्ट्सचुट

धन्यवाद! यह सही उपकरण की तरह दिखता है, लेकिन blkdiscardमेरे मानक पैकेज रिपॉजिटरी (Ubuntu 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ऑफसेट / लंबाई विकल्पों के साथ काम करने में सक्षम होने के बारे में भी नहीं जानता था । इसलिए मेरे द्वारा सुझाए गए अस्थायी विभाजन भी आवश्यक नहीं हैं। अच्छा!
फ्रॉस्ट्सचुट्ज़

जवाबों:


16

यदि आपके पास हाल ही में पर्याप्त संस्करण है util-linux, तो इसमें वह उपकरण शामिल है blkdiscardजो संपूर्ण उपकरणों को ट्रिम करने में सक्षम है, या किसी डिवाइस के भीतर --offsetऔर --lengthविकल्पों का उपयोग करता है।

कृपया ध्यान दें: blkdiscard खतरनाक है, यदि आप इसे गलत क्षेत्रों में ट्रिम करते हैं, तो आपका डेटा चला गया है!

तो आप अपने विभाजन तालिका के अनपार्टेड (मुक्त) क्षेत्रों का पता लगा सकते हैं और फिर इस उपकरण का उपयोग करके उन्हें ट्रिम कर सकते हैं। के लिए msdosऔर gptविभाजन, partedजैसे मुक्त क्षेत्र प्रदान करता है:

# 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 से छोटे क्षेत्रों की उपेक्षा करें क्योंकि वे सफलतापूर्वक छंटनी की संभावना नहीं है।


यदि आप विभाजन के बजाय LVM का उपयोग कर रहे हैं, तो आप खाली जगह के लिए LV बना सकते हैं और इसे ट्रिम कर सकते हैं:

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

यदि आप issue_discards = 1अपने में सेट करते हैं lvm.conf, तो आप blkdiscardकॉल को छोड़ सकते हैं क्योंकि LVM lvremoveअपने आप ही TRIM जारी करेगा ।


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/...
जेसन सी

मैंने एक स्क्रिप्ट बनाई है जो सभी माउंटेड फ़ाइल सिस्टम के साथ-साथ मुफ्त LVM वीजीएस पर मुफ्त स्थान
छोड़ती है

7

hdparm --trim-sector-rangesएक सीमा ट्रिम कर सकते हैं। मैन पेज इसे इस्तेमाल करने की चेतावनी देता है, इसलिए आप बेहतर सुनिश्चित करें कि आपको सही रेंज और सिंटैक्स मिले।

मुझे लगता है कि किसी विभाजन के बाहर सभी डेटा के लिए एक ट्रिम भेजना खतरनाक होगा, क्योंकि वहां कुछ छिपा हुआ डेटा होता है जैसे कभी-कभी बूटलोडर कोड या दूसरे पार्टीशन टेबल। आपको अतिशयोक्ति जानने की आवश्यकता होगी, जो विभाजन के बाहर के क्षेत्र वास्तव में अप्रयुक्त हैं।


बहुत बहुत धन्यवाद! मैं डिवाइस के आकार को hdparm, अप्रयुक्त सीमाओं से पकड़ सकता हूं sfdiskऔर तदनुसार ट्रिम कर सकता हूं । मुझे पता है कि ड्राइव पर क्या है। यदि कोई विभाजन योजना है जो डेटा को सुलभ लेकिन असंबद्ध क्षेत्रों में छिपाती है, तो यह किसी भी विभाजन संपादक की मूल कार्यक्षमता को तोड़ देगा। मुझे लगता है कि उम्मीद है कि इस तरह की कोई भी योजना लंबे समय तक छोड़ दी गई है (मुझे हालांकि मेरे सिर के ऊपर से कोई नहीं जानता)। सभी योजनाएं जो मैं जानता हूं कि एमबीआर को डिवाइस की शुरुआत में अच्छी तरह से ज्ञात अनलॉक्ड स्पेस में स्टोर किया जाता है, और आवंटित विभाजन के भीतर वीबीआर / ईबीआर। पुरानी अस्पष्ट योजनाएं हो सकती हैं जो अलग हैं। :)
जेसन सी

मुझे कुछ कठिनाई हो रही है hdparm, मैंने अपने प्रश्न को विवरण के साथ संपादित किया; अगर आप किसी भी अंतर्दृष्टि है सोच।
जेसन सी

1
लगता है जैसे कम से कम कुछ hdparm / dev / mmcblk0 पर काम नहीं करता है। क्षमा करें, मेरे पास और कोई विचार नहीं है।
माइकल सुलेमान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.