आसानी से डीईबी को अनपैक करें, पोस्टस्टीन को संपादित करें, और डीईबी को वापस करें


129

मैं इंटेल के OpenCL SDK को स्थापित करने का प्रयास कर रहा हूं, लेकिन DEB फाइलें RPM से छोटी-मोटी रूपांतरण हैं ( जिज्ञासु के लिए यहां देखें )। मुझे postinstउनके द्वारा प्रदान की गई डीईबी में स्क्रिप्ट को संपादित करने की आवश्यकता है ।

मैं एक मौजूदा डीईबी को कैसे ले सकता हूं, सामग्री को हटा सकता हूं (नियंत्रण जानकारी सहित), फिर बाद में एक नई डीईबी बनाने के लिए सामग्री को फिर से जमा कर सकता हूं। मैं केवल फाइलों को संपादित करूंगा, कोई भी फाइल नहीं जोड़ी जाएगी या निकाली जाएगी।

जवाबों:


202

डिबेट पैकेजों में हेरफेर करने का प्राथमिक आदेश है dpkg-deb

पैकेज को अनपैक करने के लिए, एक खाली निर्देशिका बनाएं और उस पर स्विच करें, फिर dpkg-debइसकी नियंत्रण जानकारी और पैकेज फ़ाइलों को निकालने के लिए चलाएँ । dpkg-deb -bपैकेज के पुनर्निर्माण के लिए उपयोग करें ।

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

खबरदार कि जब तक आपकी स्क्रिप्ट रूट के रूप में नहीं चल रही है, तब तक फाइल की अनुमतियां और स्वामित्व निष्कर्षण चरण में दूषित हो जाएंगे। इससे बचने का एक तरीका यह है कि आप अपनी स्क्रिप्ट को चलाएं fakeroot। ध्यान दें कि आपको पूरे अनुक्रम को व्यक्तिगत रूप से चलाने की आवश्यकता है fakeroot, प्रत्येक dpkg-debव्यक्तिगत रूप से नहीं , क्योंकि यह fakerootप्रक्रिया है जो फ़ाइलों की अनुमतियों की स्मृति को बनाए रखती है जो कि वे नहीं बना सकते हैं।

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

अनुमतियों के साथ गड़बड़ करने के बजाय, आप डेटा संग्रह को बरकरार रख सकते हैं और केवल नियंत्रण संग्रह को संशोधित कर सकते हैं। dpkg-debऐसा करने का कोई तरीका प्रदान नहीं करता है। सौभाग्य से, डिब पैक एक मानक प्रारूप में हैं: वे arअभिलेखागार हैं। इसलिए आप arनियंत्रण संग्रह को निकालने के लिए उपयोग कर सकते हैं , इसकी फ़ाइलों को संशोधित कर सकते हैं, और arनियंत्रण संग्रह को नए संस्करण द्वारा प्रतिस्थापित करने के लिए फिर से उपयोग कर सकते हैं ।

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

यदि आप पैकेज में कुछ भी संशोधित करते हैं तो आपको एक चैंज एंट्री जोड़ना चाहिए और संस्करण संख्या को बदलना चाहिए । डेबियन पैकेजों में हेरफेर करने के लिए बुनियादी ढांचा मानता है कि अगर दो पैकेजों का नाम और संस्करण समान है, तो वे एक ही पैकेज हैं। संस्करण संख्या के अंत में debian_revision भाग में एक प्रत्यय जोड़ें ; कारणों प्रत्यय के साथ शुरू कर देना चाहिए छँटाई के लिए ~, उदाहरण के लिए 1.2.3-4.1हो जाता है 1.2.3-4.1~johnjumper1

शेल टूल्स का उपयोग करने के बजाय, आप Emacs का उपयोग कर सकते हैं। dpkg-dev-elपैकेज (जो अपनी ही नदी के ऊपर है इस एक देशी Debian पैकेज है के रूप में) मोड संपादित करने के लिए शामिल .debफ़ाइलें और डेबियन बदलाव संपादित करने के लिए। एमएसीएस का उपयोग अंतःक्रियात्मक या स्क्रिप्टेड किया जा सकता है।


4
नियंत्रण फ़ाइल को बदलने के लिए आप fpm के -eस्विच का भी उपयोग कर सकते हैं :। यह आपके संपादक में नियंत्रण फ़ाइल खोल देगा। fpm -e -s deb -t deb ../old.deb
अर्टफेक्टो

1
btw, fakeroot bashऔर आदेश जारी करने की कोशिश स्वामित्व के विषय में काम नहीं करेगा, और arविधि बड़ी डिबेट फ़ाइलों के लिए अविश्वसनीय रूप से तेज़ है!
कुंभ पावर

1
धन्यवाद। यह उपयोगी था। dpkg-deb -Rमोड का उपयोग करके रखा गया था और निकाले गए फ़ाइलों को dpkg-deb -bरीसेट करने uid:gidके लिए 0:0। फ़ेकरूट की ज़रूरत नहीं थी (मुझे लगता है कि वहाँ समस्याएँ हो सकती हैं अगर संग्रह के अंदर {u, g} id फाइलें सेट थीं लेकिन मेरी स्थिति में ऐसा नहीं था।
PSkocik

2
@PSkocik न केवल setxid फ़ाइलें, उदाहरण के लिए फ़ाइलों और निर्देशिकाओं के अंतर्गत /etcया /varजिनके लिए किसी विशिष्ट समूह से संबंधित होना आवश्यक है।
गिल्स

8

आप इस तरह से स्क्रिप्ट को बदलने के विकल्प के साथ fpm का उपयोग कर सकते हैं :--after-installpostinst

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb

2
डेबियन / उबंटू पर fpm स्थापित करने के लिए: sudo apt-get install ruby-dev build-Essential; sudo gem इंस्टॉल करें fpm
क्रेग एस। एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.