माइक्रो Linux डिस्ट्रिब्यूशन बनाना (2023)
(popovicu.com)- Linux kernel को सीधे build करके और न्यूनतम user space तैयार करके ‘माइक्रो Linux डिस्ट्रिब्यूशन’ बनाने की प्रक्रिया को चरण-दर-चरण समझाया गया है
- ऑपरेटिंग सिस्टम kernel की भूमिका, Linux डिस्ट्रिब्यूशन के घटक, और kernel तथा user space के संबंध को बुनियाद से समझाया गया है
- उदाहरण के लिए RISC-V आर्किटेक्चर (QEMU की
riscv64 virtमशीन) का उपयोग किया गया है, लेकिन x86 जैसी अन्य आर्किटेक्चर पर भी वही सिद्धांत लागू होते हैं initprocess,initramfs, और Go में लिखे गए एक सरल shell सहित सीधे चलने योग्य न्यूनतम Linux वातावरण का निर्माण किया गया है- अंत में
u-rootप्रोजेक्ट की मदद से वास्तव में उपयोगी माइक्रो डिस्ट्रिब्यूशन बनाने का तरीका दिखाया गया है, और इसे Linux सिस्टम की समग्र संरचना समझने के लिए एक शुरुआती गाइड के रूप में पूरा किया गया है
ऑपरेटिंग सिस्टम kernel क्या है
- kernel, हार्डवेयर संसाधनों के प्रबंधन और प्रोग्राम execution control के लिए जिम्मेदार ऑपरेटिंग सिस्टम का मुख्य घटक है
- single-core वातावरण में भी कई प्रोग्राम एक साथ चलते हुए दिखें, इसके लिए multitasking management सुविधा देता है
- kernel, input/output devices के control को abstract करता है ताकि application को हार्डवेयर के address या register values सीधे न संभालने पड़ें
- उदाहरण के लिए, कोई प्रोग्राम सिर्फ “standard output पर message लिखो” का अनुरोध करता है, और kernel वास्तविक हार्डवेयर interaction संभालता है
- filesystem interface के जरिए उच्च-स्तरीय डेटा access का तरीका देता है
- file केवल disk data नहीं होती, बल्कि kernel से संवाद करने वाला एक logical interface भी होती है
- kernel, process isolation और communication model उपलब्ध कराता है, ताकि हर application स्वतंत्र रूप से चल सके या सहयोग कर सके
- Linux kernel open source है, कई तरह की आर्किटेक्चर पर चल सकता है, और दुनिया में सबसे व्यापक रूप से उपयोग होने वाले kernels में से एक है
Linux डिस्ट्रिब्यूशन क्या है
- केवल Linux kernel से उपयोगकर्ता web browser या GUI app नहीं चला सकता; इसके ऊपर software infrastructure की कई परतों की जरूरत होती है
- network setup, IP assignment, VPN management जैसे काम kernel नहीं बल्कि ऊपरी user space programs संभालते हैं
- इसलिए Linux डिस्ट्रिब्यूशन को kernel + user space infrastructure के संयोजन के रूप में परिभाषित किया जाता है
- डिस्ट्रिब्यूशन में kernel की बुनियादी क्षमताओं के ऊपर packages, tools, settings, initialization process (
init) आदि शामिल होते हैं - डिस्ट्रिब्यूशन की जटिलता अलग-अलग हो सकती है; Arch Linux जैसी न्यूनतम संरचना से लेकर Ubuntu जैसी user-friendly संरचना तक
kernel के बाहर की infrastructure: user space और init process
- kernel के boot पूरा करने के बाद सबसे पहले PID 1 process यानी
initचलाया जाता हैinit, बाद में चलने वाले सभी user space processes का ancestor होता है और सिस्टम की services व tools को क्रम से चलाता है
initद्वारा चलाए जाने वाले processes और tools का समूह ही Linux डिस्ट्रिब्यूशन का वास्तविक घटक बनता है- जैसे-जैसे डिस्ट्रिब्यूशन जटिल होते हैं, अनावश्यक features जुड़ते जाते हैं और उन्हें “bloated” कहकर आलोचना भी मिलती है
- इसके उलट, custom माइक्रो डिस्ट्रिब्यूशन बनाकर केवल जरूरी features वाला हल्का सिस्टम तैयार किया जा सकता है
RISC-V के लिए Linux kernel build करना
x86वातावरण में cross-compilation toolchain का उपयोग करके RISC-V के लिए kernel build किया जाता हैkernel.orgसेlinux-6.5.2.tar.xzsource डाउनलोड करने के बादmake ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfigचलाएँ
menuconfigके जरिए kernel settings को visual तरीके से edit किया जा सकता हैmake -j16से parallel build करने परarch/riscv/boot/Imageबनता है- QEMU में
qemu-system-riscv64 -machine virt -kernel arch/riscv/boot/Imageसे boot किया जा सकता है- boot logs में SBI layer detection, UART initialization, printk activation जैसे संदेश देखे जा सकते हैं
पहली समस्या: root filesystem नहीं है
- kernel boot के दौरान
VFS: Unable to mount root fserror से kernel panic होता है- कारण: root filesystem (
initramfs) उपलब्ध नहीं कराया गया
- कारण: root filesystem (
- filesystem केवल disk पर ही नहीं, बल्कि RAM-आधारित (
initramfs) रूप में भी बनाया जा सकता है initramfsकोcpioformat में package किया जाता है, और QEMU में-initrdoption से load किया जा सकता है
initramfs बनाना और “Hello world” चलाना
- न्यूनतम आवश्यकता है कि
/initbinary मौजूद होinit.cलिखने के बाद static link (-static) के साथ build करेंcpio -o -H newc < file_list.txt > initramfs.cpioसे package करें
- QEMU चलाने पर “Hello world” output के बाद
initके समाप्त होने से फिर kernel panic होता है- समाधान:
initबंद न हो, इसके लिए infinite loop जोड़ें
- समाधान:
Go में लिखा एक सरल shell जोड़ना
init,forkऔरexeclका उपयोग करके/little_shellचलाता हैlittle_shell.go, user input लेकर command को echo करके दिखाने वाला एक साधारण shell हैGOOS=linux GOARCH=riscv64 go build little_shell.goसे RISC-V के लिए build करें
initऔरlittle_shellदोनों UART के जरिए output साझा करते हैं- standard input/output file handles के रूप में manage होते हैं और
forkके समय inherit होते हैं
- standard input/output file handles के रूप में manage होते हैं और
- नतीजतन “Hello from init” और shell input का बारी-बारी से दिखना, एक बुनियादी Linux वातावरण के पूरा होने को दर्शाता है
kernel की भूमिका का सार
- हार्डवेयर abstraction: user programs को UART या device details जाने बिना भी output देना संभव होता है
- high-level interface उपलब्ध कराना: filesystem के जरिए दूसरी binary (
little_shell) तक access - process isolation:
initऔर shell अलग-अलग memory space में चलते हैं - kernel, जटिल हार्डवेयर के ऊपर स्थिर और portable execution foundation प्रदान करता है
ऑपरेटिंग सिस्टम की परिभाषा
- कुछ लोग केवल kernel को ही ऑपरेटिंग सिस्टम मानते हैं, जबकि कुछ पूरे डिस्ट्रिब्यूशन को ऑपरेटिंग सिस्टम मानते हैं
- महत्वपूर्ण बात है kernel और user space की role boundary और interaction structure को समझना
u-root से वास्तव में उपयोगी माइक्रो डिस्ट्रिब्यूशन बनाना
- u-root प्रोजेक्ट Go-आधारित user space tools का सेट उपलब्ध कराता है
u-root, Linux kernel के ऊपर चलने वाला user space bootloader और shell environment भी शामिल करता है
- install करने के बाद
GOOS=linux GOARCH=riscv64 u-rootcommand सेinitramfsअपने-आप बन जाता है/tmp/initramfs.linux_riscv64.cpiofile को QEMU में चलाया जा सकता है
- boot के समय “Welcome to u-root!” banner के साथ default shell prompt मिलता है
ls,pwd,echoजैसे basic commands और tab completion भी supported हैं
network connection का अभ्यास
- QEMU में
virtio-net-deviceऔरvirtio-rng-pcidevices जोड़े जाते हैं-device virtio-net-device,netdev=usernet -netdev user,id=usernetoption का उपयोग
u-rootकेdhclientसे DHCP के जरिए IP अपने-आप assign हो जाता है- उदाहरण:
eth0को10.0.2.15/24assign होना
- उदाहरण:
wget http://google.comसे external network access सफल होता है, औरindex.htmldownload होना देखा जा सकता है
package manager और init का महत्व
- सामान्य डिस्ट्रिब्यूशन package manager के जरिए software को dynamic तरीके से install और update करते हैं
- यह अभ्यास embedded-style approach का है, इसलिए पूरी image को फिर से build करना पड़ता है
init, सिर्फ process launcher नहीं बल्कि device initialization, service management, और system boot control का मुख्य घटक हैu-rootकेinitsource code में विभिन्न devices (/dev) की setup प्रक्रिया देखी जा सकती है
GitHub repository
- इस guide का पूरा code और examples popovicu/linux-micro-distro में उपलब्ध हैं
initramfsimage build और अभ्यास को दोबारा किया जा सकता है
1 टिप्पणियां
Hacker News राय
मैं कई महीनों से खुद एक micro Linux distribution बना रहा हूँ
user mode एक ही single static binary से बना है, और confidential microVM container सपोर्ट करने के लिए सिर्फ कुछ फाइलें हैं
खास तौर पर initramfs की संरचना दिलचस्प है। kernel cpio archive को अनपैक करता है, tmpfs में प्रवेश करता है और /init चलाता है — यह प्रक्रिया किसी जादू जैसी लगती है
कई cpio archive को एक साथ जोड़ा भी जा सकता है, हर एक को compress किया जा सकता है, और वे क्रम से overlay होते हैं
इस सरल लेकिन elegant design की वजह से मैंने खुद unpack code लिखते हुए बहुत कुछ सीखा
हाल में qemu ने प्रमुख architecture पर uftrace को सपोर्ट करना शुरू किया है
जब experts पूछते हैं, “इसे debug कैसे करें?”, तो यही उसका सीधा जवाब है
संबंधित जानकारी इस thread में देखी जा सकती है
मैं भी इसी तरह के एक प्रोजेक्ट पर काम कर रहा हूँ — azathos
इसमें मेरा खुद का बनाया हुआ toy init, shell, और कुछ utilities शामिल हैं
debugging के लिए मैंने GNU coreutils डाले हैं, और अभी framebuffer पर window draw करने की functionality पर फोकस कर रहा हूँ
यह प्रोजेक्ट सच में शानदार है। 98 में floppy-आधारित “distribution” बनाकर Windows PC imaging को UDP broadcast से चलाने वाले दिन याद आ गए
“make bzimage”, init script errors, endless reboot... बहुत सारी यादें हैं
यह दिलचस्प है कि आज के तरीके भी बहुत अलग नहीं हैं। अगर इसे Raspberry Pi के लिए port किया जाए तो यह मजेदार और educational होगा। शायद मैं खुद भी इसे आज़माऊँ
आखिर में एक दोस्त ने sftp की सामग्री CD पर burn करके दी, तब जाकर समस्या हल हुई — और उस समय सिर्फ 2x speed पर ही लिखा जा सकता था
मैं सोच रहा हूँ कि इसे cloud image के रूप में (जैसे Vultr, DigitalOcean) चलाना, या GUI उठाकर Firefox चलाना कितना मुश्किल होगा
किसी दूसरे distribution से boot करने के बाद kexec से अपना kernel चलाकर memory में install करने का तरीका भी संभव है
इसका वास्तविक implementation उदाहरण nixos-anywhere में देखा जा सकता है
यह सोचे जाने से ज्यादा सरल काम है
अगर इस प्रोजेक्ट का Raspberry Pi को लक्ष्य करके बनाया गया कोई version हो, तो वह वाकई बहुत दिलचस्प होगा
मैं सोच रहा था कि कोई इसे खुद क्यों बनाएगा — क्या Linux को explore करने के लिए बस Gentoo इस्तेमाल करना काफी नहीं है?
आप user space को customize कर सकते हैं, लेकिन Linux को खुद समझने के लिए यह बहुत उपयुक्त नहीं है
सिर्फ stage3 tarball को देखकर भी लगता है कि वह पहले से ही एक “mini distribution” के स्तर का है
सीखने के लिए यह सच में बहुत अच्छा है, और अगर जल्दी कुछ तैयार करना हो तो buildroot एक अच्छा विकल्प है
इस लेख की वजह से मैंने सच में बहुत कुछ सीखा। इतने जानकारी-समृद्ध post के लिए धन्यवाद