यह सिर्फ इतना हुआ कि कुछ साल पहले, विकास टीम के लिए ड्यूटी पर, जिससे मैं संबंधित हूं, एक अप्रत्याशित कार्य गिर गया - उपकरण प्रबंधन प्रणाली का विकास (यह सिर्फ कोई आश्चर्य की बात नहीं है, क्योंकि विकास की दिशा यह है) लिनक्स के लिए एक नियंत्रण पीसी के साथ।
लिनक्स हिस्सा विकसित किया गया था (और चल रहा है) उबंटू के तहत, कोड :: ब्लॉक वातावरण में। लेकिन, जैसा कि अभ्यास से पता चला है, गुणवत्ता वाले काम के लिए आपको गारंटीकृत प्रतिक्रिया समय के साथ कुछ अधिक आसान चाहिए। कंसोल काम के लिए पर्याप्त था, क्योंकि टीसीपी / आईपी के माध्यम से जुड़े एक दूरस्थ कंप्यूटर पर उपयोगकर्ता इंटरफ़ेस को व्यवस्थित करने के कार्य हल किए गए थे।
फिर हमारे अपने विधानसभा के लिनक्स वितरण का उपयोग करने के लिए विचार आया, जो (वितरण विधानसभा), वास्तव में, मेरे खाली समय में मैंने किया था। पसंद LFS पर गिर गई। इस तथ्य के बारे में कि इस तरह के एलएफएस को बार-बार हैबे पर भी लिखा गया है, मैं कई अतिरिक्त (सरल लिनक्स को छोड़कर) कार्यों का समाधान बताऊंगा जो हमारे विशेष मामले में मेरे सामने उत्पन्न हुए हैं।
सबसे पहले, केवल एक ऐसा कार्य था - वास्तविक समय कोर का उपयोग करने के लिए।
हालाँकि, आगे, जब वितरण किट के साथ USB फ्लैश ड्राइव का विचार सभी को पसंद आया, तो फ्लैश ड्राइव को बढ़ाने और विभिन्न कंप्यूटरों पर सिस्टम शुरू करने के कार्य थे (कई परीक्षण स्टैंड हैं, आपकी जेब में आपका फ्लैश ड्राइव है और किसी एक पर जाएं)। यहां समस्याएं दिखाई दीं - LFS में एक कंप्यूटर से दूसरे कंप्यूटर में 100% पोर्टेबिलिटी नहीं है। इसे एक विशिष्ट कंप्यूटर के अनुकूल बनाने के लिए, आपको कुछ स्क्रिप्ट्स को संपादित करने की आवश्यकता है, जो कि कल की विंडोज एन्कोडर की टीम के तहत समस्याग्रस्त है (कुछ को उबंटू वर्चुअल मशीन में स्थानांतरित किया गया था, लेकिन कंसोल और स्क्रिप्ट एक आपदा हैं)। प्रणाली के पुनरुत्पादन के लिए विधानसभा प्रक्रिया के दौरान किए गए कुछ जोड़तोड़ों की पुनरावृत्ति की आवश्यकता होती है (उसी GRUB को स्थापित करें)।
स्वाभाविक रूप से, सभी समस्याओं का समाधान इंटरनेट पर है, लेकिन, मुझे लगता है, एक जगह पर कुछ जानकारी एकत्र करने से किसी को चोट नहीं पहुंचेगी।
तो, विशिष्ट कार्य इस प्रकार थे ...
1. एक वास्तविक समय पैच के साथ लिनक्स कर्नेल का उपयोग करना
यह सबसे आसान कामों में से एक था। निर्माण प्रक्रिया एक अपवाद के साथ एलएफएस पुस्तक के माध्यम से चली गई - पुस्तक के लिए नियमित कर्नेल के बजाय, 2.6.33.9 और इसके लिए एक
आरटी पैच लिया गया। जहां भी कर्नेल में हेरफेर किया गया था (लिनक्स हेडर और कर्नेल को सीधे स्थापित करना), हम अपने पैच किए गए संस्करण के साथ काम करते हैं।
यह भी कहना उपयोगी होगा कि वितरण किट एक स्वैप विभाजन को जोड़ने के बिना बनाया गया था (हमारे मामले में 2GB RAM छत के ऊपर है, गारंटीकृत प्रतिक्रिया समय पर इसके नकारात्मक प्रभाव के कारण स्वैप वांछनीय नहीं है, और यह फ्लैश ड्राइव के लिए बेहद विनाशकारी है) और था एक एकल ext2fs विभाजन।
2. सिस्टम में स्वत: प्रवेश (विकास के माहौल में, सुरक्षा हमारे लिए महत्वपूर्ण नहीं है, और सिस्टम कई कारणों से रूट के तहत लॉन्च किया गया है)
ऑटो-लॉगिन का विचार
यहाँ से लिया गया था।
निम्न सामग्री के साथ एक ऑटोलॉगिन फ़ाइल बनाई गई थी:
int main() { execlp("login", "login", "-f", "root", 0); }
अगला, फ़ाइल कमांड द्वारा संकलित की गई:
gcc autologin.c -o /usr/local/sbin/autologin
आगे यह तय किया गया कि स्वचालित लॉगिन वाले दो कंसोल पर्याप्त होंगे (एक सिस्टम शुरू करने के लिए, दूसरा सब कुछ के लिए, यदि आवश्यक हो)।
/ Etc / inittab फ़ाइल में, लाइनें:
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
द्वारा प्रतिस्थापित किया गया है:
1:2345:respawn:/sbin/agetty -n -l /usr/local/sbin/autologin tty1 9600
2:2345:respawn:/sbin/agetty -n -l /usr/local/sbin/autologin tty2 9600
उसके बाद, स्वचालित लॉगिन के साथ कोई समस्या नहीं थी, इसलिए अतिरिक्त स्क्रिप्ट जोड़तोड़ नहीं थे।
3. कनेक्टिंग ड्राइव के क्रम से सिस्टम को एकजुट करना
विभिन्न BIOS की अपनी परेशानियां हैं। कुछ, उदाहरण के लिए, मानते हैं कि पहला वह ड्राइव है जिससे हम बूट करते हैं। इस मामले में, हमारी फ्लैश ड्राइव एसडीए होगी। दूसरों का मानना है कि हार्ड ड्राइव पहले जाना चाहिए, और फिर अन्य डिवाइस। इस स्थिति में, हमारे फ्लैश ड्राइव में sdb, sdc इत्यादि नाम होंगे।
नतीजतन, सिस्टम एक डिस्क से बूट नहीं हो सकता है जो मौजूद नहीं है, फिर मूल निर्देशिका को इस कारण से माउंट नहीं किया जा सकता है कि गलत ड्राइव / etc / fstab में निर्दिष्ट है।
एक विशिष्ट मशीन के लिए /boot/grub/grub.cfg और / etc / fstab को ठीक करने या ड्राइव नाम (sda, sdb, इत्यादि) का उपयोग करके और डाउनलोड करने और माउंट करने के लिए सब कुछ हल किया गया है, लेकिन फ़ाइल सिस्टम का UUID, जो इस फाइल सिस्टम के लिए है। एक फ्लैश ड्राइव पर अद्वितीय और, सबसे महत्वपूर्ण बात, स्थायी होगा।
समस्या यह है कि GRUB UUID के साथ काम कर सकता है, लेकिन कर्नेल नहीं कर सकता है, अर्थात, UUID द्वारा सीधे रूट सिस्टम को माउंट करना असंभव है (डिवाइस का नाम जाने बिना)। यह एक बग नहीं है, लेकिन लिनुस टॉर्वाल्ड्स के वैचारिक विचारों का एक परिणाम है, इसलिए आपको भविष्य में इस तरह के अवसर की उम्मीद नहीं करनी चाहिए। फिर भी, वर्कअराउंड हैं - यह
इनट्रामर्फ है ।
Initramfs एक अस्थायी फ़ाइल सिस्टम है जो वास्तविक सिस्टम के फ़ाइल सिस्टम को डाउनलोड करने और माउंट करने में मदद करता है।
Initramfs मानक LFS असेंबली में शामिल नहीं है, इसलिए, इसे बनाने के लिए, हम
जेंटू विकी की सिफारिशों का उपयोग करेंगे और हमारे स्वयं के कुछ विचार (जेंटू विकी से संस्करण बिना परिवर्तन के डिस्क नामों के साथ समस्या को हल नहीं करते हैं, और यह ठीक से काम नहीं करता है)।
एक सरल initramfs सिस्टम बनाने के लिए जो हमारे मुख्य UUID को मापता है, आपको एक सरल शेल और एक init स्क्रिप्ट की आवश्यकता होती है। कमांड लाइन उपयोगिताओं का एक पूरा सेट initramfs के लिए पर्याप्त बोझिल है, इसलिए व्यस्त बॉक्स का उपयोग अक्सर इस उद्देश्य के लिए किया जाता है, जो कि मामूली आकार और आवश्यकताओं के साथ सबसे अधिक उपयोग की जाने वाली उपयोगिताओं में से कुछ को लागू करता है।
हम व्यस्तबॉक्स का नवीनतम संस्करण चुनते हैं:
cd sources
wget http://busybox.net/downloads/busybox-1.18.4.tar.bz2
अनपैक और कॉन्फ़िगर करें:
tar jxf busybox-1.18.4.tar.bz2
cd busybox-1.18.4
make menuconfig
मेनू (लिनक्स कर्नेल की तरह) का उपयोग करके कॉन्फ़िगरेशन किया जाता है। सिद्धांत रूप में, मानक कॉन्फ़िगरेशन हमारी आवश्यकताओं के लिए पर्याप्त है, लेकिन सिर्फ मामले में, यह जाँचने योग्य है कि निम्नलिखित सुविधाएँ जुड़ी हुई हैं:
Devfs के लिए समर्थन - dev / के साथ काम करने के लिए devfs के लिए समर्थन।
एक स्थिर पुस्तकालय (कोई साझा लाइब्रेरी नहीं) के रूप में बिजीबॉक्स का निर्माण करें - एक स्टैटिक लेआउट, ताकि लाइब्रेरियों के एक समूह को खींच न सकें।
समर्थन संस्करण 2.6.x लिनक्स कर्नेल - 2.6 कर्नेल कोर के लिए समर्थन।
साथ ही उपयोगिताओं की कार्यक्षमता के लिए समर्थन: श, बिल्ली, कट, खोज, माउंट, umount, नींद, गूंज, switch_root।
हम संकलन करते हैं:
make
अब हम अपने फाइल सिस्टम के डायरेक्टरी ट्री को इकट्ठा करते हैं:
mkdir /usr/src/initramfs
cd /usr/src/initramfs
mkdir -p bin lib dev etc mnt/root proc root sbin sys
cp -a /dev/{null,console} /usr/src/initramfs/dev/
बिजीबॉक्स कॉपी करें और उपयोगिताओं के लिंक बनाएं:
cp /sources/busybox-1.18.4/busybox ./bin/
cd bin
ln -s busybox sh
ln -s busybox cat
ln -s busybox cut
ln -s busybox findfs
ln -s busybox mount
ln -s busybox umount
ln -s busybox sleep
ln -s busybox switch_root
cd ..
यह init स्क्रिप्ट लिखने के लिए बनी हुई है:
हम अपनी स्क्रिप्ट को निष्पादन योग्य बनाते हैं:
chmod +x /usr/src/initramfs/init
एक संग्रह में हमारे अस्थायी फ़ाइल सिस्टम लाना:
cd /usr/src/initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initrd.img-2.6.33-rt31
चलो फ़ाइल नाम पर ध्यान दें - यह कर्नेल नाम के अनुरूप होना चाहिए (यह सही ढंग से इसे लेने के लिए GRUB के लिए आवश्यक है)। यही है, यदि कर्नेल को vmlinux-
2.6.33-rt31 नाम दिया गया है, तो initramfs को initrd.img-
2.6.33-rt31 नाम दिया जाना चाहिए।
अब जब grub-mkconfig चलाया जाता है, GRUB initramfs का पता लगाएगा और कॉन्फ़िगरेशन में रूट सिस्टम का UUID भी शामिल करेगा। जांच करने के लिए, आप अपने हाथों से /boot/grub/grub.cfg को ठीक कर सकते हैं। उदाहरण के लिए, विन्यास:
menuentry "Linux 2.6.33-rt31" --class gnu-linux --class gnu --class os {
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 47029df8-8567-417d-b813-eedfe1ff8b0f
linux /boot/vmlinux-2.6.33-rt31 root=/dev/sda1 ro
}
ठीक करना:
menuentry "Linux 2.6.33-rt31" --class gnu-linux --class gnu --class os {
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 47029df8-8567-417d-b813-eedfe1ff8b0f
linux /boot/vmlinux-2.6.33-rt31 root=UUID=47029df8-8567-417d-b813-eedfe1ff8b0f ro
initrd /boot/initrd.img-2.6.33-rt31
}
फाइल सिस्टम UUID को निम्नानुसार पाया जा सकता है (उदाहरण के लिए, / dev / sdb1 के लिए):
blkid -p -o udev /dev/sdb1
यह लाइन को बदलने के लिए / etc / fstab को ठीक करने के लिए रहता है:
/dev/sda1 / ext2 defaults 1 1
पर
UUID= 47029df8-8567-417d-b813-eedfe1ff8b0f / ext2 defaults 1 1
यह भी ध्यान दिया जाना चाहिए कि उपरोक्त सभी जोड़तोड़ के लिए यह आवश्यक है कि कर्नेल devtmpfs (CONFIG_DEVTMPFS = y) और initramfs (CONFIG_BLK_DEV_INITRD / y) का समर्थन करता है।
4. नेटवर्क कार्ड से सिस्टम को खोलना
यदि कंप्यूटर में एक से अधिक नेटवर्क एडाप्टर स्थापित है, तो कर्नेल मॉड्यूल के समानांतर लोडिंग इन बोर्डों को नामों के निरंतर असाइनमेंट की गारंटी नहीं देते हैं। उदाहरण के लिए, दो बोर्ड हैं। Board_1 में eth0 सिस्टम में इंटरफ़ेस नाम है, Board_2 में eth1 है। अगले रिबूट पर, ऐसा हो सकता है कि बोर्ड 1 एथ 1 हो जाता है, और बोर्ड 2 एथ0 बन जाता है।
इसके लिए, LFS एक विशिष्ट बोर्ड को नाम देता है। जब दूसरे कंप्यूटर पर बूट होता है, तो यह बहुत संभावना है कि नेटवर्क नहीं उठेगा।
मेरे विशेष मामले में, सभी कंप्यूटरों पर बोर्ड समान है और आईपी स्थिर है (केवल सीधे टर्मिनल कंप्यूटर के साथ संचार)।
LFS में नेटवर्क इंटरफ़ेस का उत्थान स्क्रिप्ट /etc/rc.d/init.d/network द्वारा किया जाता है। हम एक स्क्रिप्ट जोड़ेंगे ताकि हर बार कॉन्फ़िगरेशन फ़ाइल /etc/udev/rules.d/70-persistent-net.rules उत्पन्न हो और काम पूरा होने पर यह फ़ाइल हटा दी जाए। मुझे संदेह है कि एक सरल विधि है, लेकिन जो विधि मिली है, उसने काम किया है, और सिस्टम असेंबली के समय यूदेव संचालन के सिद्धांतों में खुदाई करने की कोई विशेष इच्छा नहीं थी।
केस कमांड के आरंभ खंड में, जोड़ें:
for NIC in /sys/class/net/* do INTERFACE=${NIC##*/} udevadm test --action=add $NIC done
और स्टॉप सेक्शन के अंत में (तुरंत पहले;;) जोड़ें:
rm /etc/udev/rules.d/70-persistent-net.rules
अब, किसी भी सिस्टम पर बूट करते समय, नेटवर्क इंटरफ़ेस का नाम eth0 (सबसे विदेशी मामलों को छोड़कर) होगा और नेटवर्क उठ जाएगा। बेशक, IPv4 फ़ाइल के साथ निर्देशिका /etc/sysconfig/network-devices/ifconfig.eth0 मौजूद होना चाहिए। इस फ़ाइल की सामग्री LFS पुस्तक में वर्णित है।
5. किसी भी फ्लैश ड्राइव पर LFS स्थापित करने वाली स्क्रिप्ट लिखना
अंतिम चीज़ सिस्टम का एक संग्रह और एक स्क्रिप्ट बनाने के लिए है जो इसे एक मध्यस्थ माध्यम पर स्थापित करेगी।
हम दूसरे सिस्टम में बूट करते हैं (USB फ्लैश ड्राइव से नहीं), USB फ्लैश ड्राइव माउंट करें, उदाहरण के लिए / mnt / usb-os में। सामग्री पुरालेख:
cd /mnt/usb-os
tar -cvjf ~/pack.tar.bz2 *
हम install_usb-os.sh स्थापित करने के लिए एक स्क्रिप्ट लिख रहे हैं। एक पैरामीटर के रूप में, स्क्रिप्ट उस डिवाइस का नाम लेती है जिस पर आप सिस्टम को तैनात करना चाहते हैं (उदाहरण के लिए, / dev / sdb)। स्क्रिप्ट ही आवश्यक विभाजन और फ़ाइल सिस्टम (/ dev / sdb1, यदि नाम / dev / sdb निर्दिष्ट है) बनाएगा, संग्रह को अनपैक करें और GRUB स्थापित करें।
यह रूट विशेषाधिकारों के साथ चलना चाहिए और वास्तव में, बहुत खतरनाक है।
यदि डिवाइस का नाम गलत तरीके से निर्दिष्ट है, तो काम करने वाले डिस्क के सभी डेटा नष्ट हो सकते हैं!
अब हमारी स्क्रिप्ट को निष्पादन योग्य बनाते हैं:
chmod +x install_usb-os.sh
हम स्क्रिप्ट के साथ निर्देशिका में pack.tar.bz2 संग्रह को जगह देते हैं और इंस्टॉलर तैयार है!