इसका सामान्य उत्तर iso फ़ाइल को अनपैक करना, उसे संशोधित करना और फिर से पैक करना है। यह "आईएसओ मास्टर" जैसा दिखता है, जैसा कि DV3500ea के उत्तर में वर्णित है, ऐसा करने के लिए एक अच्छा फ्रंट-एंड है।
अगर:
- आपके पास उसके लिए पर्याप्त जगह नहीं है
- आप केवल पूरी चीज़ को फिर से लिखने के बजाय एक सर्जिकल संशोधन करना चाहते हैं
- आप एक संग्रहण डिवाइस को संशोधित करना चाहते हैं जिसमें पूरे उपकरण की नकल के बिना एक आइसोफ फाइलसिस्टम (उर्फ iso9660) है, या
- अगर आपको लगता है कि यह अनपैकिंग / रीपैकिंग बात सिर्फ हैक करने लायक नहीं है
तो यह जवाब आपके लिए है!
सारांश में, हम अपनी इच्छित फ़ाइल के साथ एक मौजूदा फ़ाइल को आइसोफ फाइलसिस्टम में बदल देंगे। हमारी इच्छित फ़ाइल मौजूदा (लक्ष्य) फ़ाइल से छोटी होनी चाहिए, और अनुगामी व्हाट्सएप (या कचरा) स्वीकार्य होना चाहिए। इसके लिए वास्तव में केवल दो आदेशों की आवश्यकता होती है, लेकिन सावधान रहें: एक टाइपो लक्ष्य फ़ाइल सिस्टम को पूरी तरह से नष्ट कर सकता है, या यहां तक कि स्रोत फ़ाइल को अधिलेखित कर सकता है। बैकअप आपके दोस्त हैं!
मेरे मामले में, मैं एक स्क्रिप्ट को लाइव बूट में संग्रहीत करना चाहता था, इसलिए मुझे हर बार इसे वापस नहीं लेना है। स्क्रिप्ट पर है script.py
और मेरा लक्ष्य (एक यूएसबी स्टिक) है /dev/sdc
। स्क्रिप्ट का आकार 202 बाइट्स है, इसलिए हमारा पहला कदम 202 बाइट्स से बड़ी फ़ाइल ढूंढना है, इसलिए हम इसे अधिलेखित कर सकते हैं। इस पर बढ़ते जाने के बाद /mnt
, मुझे एक उपयुक्त फ़ाइल मिली /mnt/info.txt
।
हम info.txt
माउंटपॉइंट पर बस ओवरराइट नहीं कर सकते , यह शिकायत करेगा कि यह केवल पढ़ने के लिए फाइल सिस्टम है। हम जड़ हैं, हालांकि, चलो उन्हें दिखाने का क्या मतलब है! हमें यह पता लगाने की जरूरत info.txt
है कि फाइलसिस्टम पर कहां है। info.txt
उदाहरण के लिए This is the official distribution CD of X.
, (शायद) अद्वितीय है , और इसके लिए डिस्क पर खोजें: कुछ स्ट्रिंग खोजें
$ sudo strings -a -t d /dev/sdc | grep 'CD of X.'
2573588480 This is the official distribution CD of X. See INSTALL for how to [...]
वैकल्पिक रूप से, यह भी ग्रेप है, जो एक बहुत तेजी से होता है के साथ किया जा सकता है, लेकिन फिर आप शुरू से ही यह निर्दिष्ट करना होगा: $ sudo grep -oba 'This is ...' /dev/sdc
।
अब जब हम जानते हैं कि यह कहाँ है, तो हमें बस उन बाइट्स को अपनी फ़ाइल से बदलना होगा:
$ sudo dd if=script.py of=/dev/sdc conv=notrunc bs=1 seek=2573588480 count=202
यह रेखा:
- इनपुट फ़ाइल (
if
) से आउटपुट फाइल ( of
) तक की प्रतियां बाइट करती हैं , और यह परवाह नहीं करता है कि आउटपुट फाइल वास्तव में एक डिवाइस है, क्योंकि "सब कुछ एक फाइल है"।
conv=notrunc
यह आउटपुट फ़ाइल को छोटा नहीं करने के लिए कहता है, क्योंकि हम केवल कुछ बाइट्स को अधिलेखित करना चाहते हैं, न कि एक निश्चित बिंदु से फ़ाइल को ओवरराइट करना।
bs=1
ब्लॉक आकार को 1. पर सेट करें। आप आमतौर पर 4k या उच्चतर ब्लॉक आकार चाहते हैं, लेकिन यह दोनों गणित (इनलाइन) गणित करने से बचते हैं और हमें स्थान को बाइट तक निर्दिष्ट करते हैं।
seek=N
आउटपुट फ़ाइल में एक निश्चित बिंदु की तलाश करता है (ध्यान दें कि इससे seek=N
अलग है skip=N
क्योंकि skip
इनपुट फ़ाइल से स्काइप बाइट्स!)। हम इसे निर्धारित करते हैं, निश्चित रूप से, जहां लक्ष्य पाठ है।
count=N
केवल इस कई बाइट्स की प्रतिलिपि बनाएँ। मुझे लगता है कि इसे छोड़ दिया जा सकता है क्योंकि यह इनपुट फ़ाइल के अंत को नोटिस करेगा, लेकिन मैंने इसे केवल सुनिश्चित करने के लिए छोड़ दिया।
और वॉयला, फ़ाइल अधिलेखित है!
लेकिन रुकिए, लक्ष्य फ़ाइल हमारी स्क्रिप्ट से बड़ी थी, इसलिए USB स्टिक पर, फ़ाइल अब कुछ इस तरह है: "जबकि करते हैं तो () blah; blah (); yright 2007 X Inc."। कूड़ा कचरा है। इसे ठीक करने के दो तरीके: हमारी इनपुट फ़ाइल को अधिक समय तक बनाएं (रिक्त स्थान जोड़ें), या अंत में एक टिप्पणी प्रतीक जोड़ें। ध्यान दें कि कई संपादकों, अंत में एक नई पंक्ति जोड़ें ताकि आप सेट करना चाह सकते हैं count=
करने के लिए N-1
बाइट (यदि आपकी फ़ाइल अब 203 बाइट्स है, और आप है कि पिछले बाइट एक नई पंक्ति, 202 करने के लिए सेट गिनती है नोटिस)। आप xxd script.py | tail
अंतिम बाइट है 0a
(या, अजीब मामलों में, 0d
) का उपयोग करके और जाँच करके newlines के लिए एक फ़ाइल की जाँच कर सकते हैं ।
यह प्रक्रिया एक .iso
फ़ाइल के लिए समान है , बस मानसिक रूप से बदल देती /dev/sdc
है your.iso
।
ध्यान दें कि जब आप अपने माउंटपॉइंट में लक्ष्य की जांच करते हैं कि क्या यह काम करता है, तो आपको strings
फिर से उपयोग करने की आवश्यकता हो सकती है (इस समय अपनी स्क्रिप्ट की खोज) क्योंकि फ़ाइल अभी भी कैश में है।