डीबूटस्ट्रैप के साथ बूट करने योग्य डेबियन छवि बनाना


13

मैं पिछले 2 दिनों से एक बूट करने योग्य डेबियन (jessie / 8.4) छवि बनाने की कोशिश कर रहा हूं, और जहां तक ​​मैं बता सकता हूं कि मेरे पास प्रक्रिया सही है, लेकिन मुझे फाइलसिस्टम ठीक नहीं मिल रहा है। मुझे अपेक्षाकृत यकीन है कि मैं यहां कुछ गलत कर रहा हूं, कुछ बढ़ते के साथ गायब है /etc/fstab( या मेरी छवि में कोई नहीं है )। मैं उम्मीद कर रहा था कि किसी के अनुभव के साथ कोई मेरी मदद करेगा / मुझे दिखाएगा कि मुझे क्या याद आ रहा है।

यहां वे त्रुटियां हैं जो मैं देखता हूं कि मैं qemu-system-x86 में बूट कर रहा हूं:

पाठ के रूप में और फिर वास्तविक स्क्रीनशॉट के रूप में:

त्रुटियाँ:

fsck: error 2 (No such file or directory) while executing fsck.ext2 for /dev/sda1
fsck exited with status code 8
[FAILED] Failed to start Load/Save Random Seed
See `systemctl status systemd-random-seed.service` for details.
[FAILED] Failed to start Various fixups to make systemd work better on Debian.
See `systemctl status debian-fixup.service` for details.
...
[FAILED] Failed to start Update UTMP about System Boot/Shutdown.
See `systemctl status systemd-update-utmp.service` for details.
[DEPEND] Dependency failed for Update UTMP about System Runlevel Changes.

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

यहाँ मैंने अपने लिए लिखे गए निर्देश / कदम उठाए हैं:

cd ~
mkdir debootstrap
cd debootstrap/
# get newest
wget http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.80_all.deb
ar -x debootstrap_1.0.80_all.deb
zcat /root/debootstrap/data.tar.gz | tar xv

apt-get install parted


# 1.5Gbytes
dd if=/dev/zero of=1445.img bs=1024 count=1 seek=1536k

parted -s 1445.img -- mklabel msdos mkpart primary 1m 1.5g toggle 1 boot
losetup --show -f 1445.img
# prints out `/dev/loopX`, enter this on the next lin
partprobe /dev/loop0
# only have to make the filesytem once --> if you are troubleshooting steps, do not redo this line
mkfs -t ext2 /dev/loop0p1
mount /dev/loop0p1 /mnt

debootstrap --verbose --components=main,contrib,non-free \
--include=firmware-realtek,linux-image-amd64,grub-pc,ssh,vim \
--exclude=nano \
--arch amd64 jessie /mnt http://ftp.us.debian.org/debian

स्रोत का उपयोग करने के बारे में जानकारी के लिए - स्रोत

  • सुनिश्चित करें कि कर्नेल स्थापित है, यह /boot चेरोट के भीतर दिखाई देना चाहिए , जो /mnt/boot निम्न फ़ाइलों के साथ है:

    • initrd.img-3.16.0-4-amd64
    • vmlinuz-3.16.0-4-amd64
    • config-3.16.0-4-amd64
    • System.map-3.16.0-4-amd64
  • ग्रब स्थापित करें

    grub-install --boot-directory=/mnt/boot --modules=part_msdos /dev/loop0
    
  • APT सेट करें

    • उपयुक्त स्रोतों पर कॉपी करें

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • सुनिश्चित करें कि cdrom स्रोत से टिप्पणी की गई है

    • लाइन जोड़ें:

      deb http://ftp.debian.org/debian stable-backports main contrib non-free
      

एक कैरोट सेट करें

mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev /mnt/dev

# if you want your pushprofilesettings
cp ~/.bashrc /mnt/root/
cp ~/.vimrc /mnt/root/

# chroot -- enter the system as if it were thy own
chroot /mnt /bin/bash
export HOME=/root
export LC_ALL=C
export LANG=C.UTF-8
export TERM=xterm-256color

mount से आदमी माउंट :
--bind रिमाउंट एक सबट्री कहीं और (उसकी सामग्री को दोनों स्थानों में उपलब्ध हैं)।
-t <type>फाइल सिस्टम प्रकार का माउंट , इसके साथ, mountऑटो निर्धारित करने का प्रयास करेगा

सेटअप सीरियल / कंसोल एक्सेस

संपादित करें /etc/default/grub:

  1. इस पर सेट GRUB_CMDLINE_LINUX=""करें:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. टिप्पणी हटाएं GRUB_TERMINAL=console

  3. नीचे, लाइन जोड़ें:

    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    

ग्रब कॉन्फिगर करें - यह एक गैर- शेल में किया जाना चाहिए (इसका मतलब है कि )systemd-nspawn chroot

grub-mkconfig -o /boot/grub/grub.cfg

चिरोट से बाहर निकलें

exit

चुरोट के लिए सफाई करें

umount /mnt/sys
umount /mnt/dev
umount /mnt/dev/pts
umount /mnt/proc

के साथ अतिरिक्त आरोह के लिए जाँच कर सकते हैं: mount | grep /mnt और फिर उनके साथ अनमाउंट करें umount

Systemd-nspawn डालें

systemd-nspawn -D /mnt
# not you are in a special container

के rootसाथ पासवर्ड सेट करेंpasswd

में /etc/ssh/sshd_configटिप्पणी बाहर PermitRootLogin without-passwordपढ़ने के लिए #PermitRootLogin without-passwordऔर सम्मिलित PermitRootLogin yesउसके नीचे

अब स्टार्टअप पर ssh सक्षम करें

systemctl enable ssh

साफ - सफाई

# this is needed to clean up both chroot and systemd-nspawn -D /mnt
# once this is run you can not do systemd-nspawn either so wait until you are entirely done
exit
umount /mnt
losetup -d /dev/loop0

के साथ अतिरिक्त आरोह की जाँच करें: mount | grep /mnt यदि कुछ भी लौटाया जाता है, तो उन्हें अनमाउंट करें umount

पुनर्प्राप्त (केवल ERROR में आवश्यक)

यदि आपने कुछ तोड़ दिया है, या फिर से प्रयास करने की आवश्यकता है, तो मौजूदा पर RE-MOUNT / SETUP CHROOT .img :

losetup --show -f 1445.img
# prints out `/dev/loopX`, enter this on the next lin
partprobe /dev/loop0
mount /dev/loop0p1 /mnt

परीक्षण img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0

अब शायद @ 505e06b2 की उत्तर-टिप्पणी को हटा दिया गया: आपके "गाइड" ने मिनिमल उबंटू 16 थंबड्राइव बनाने के लिए अद्भुत काम किया। केवल एक चीज जो मैंने बदली, वह थी डेबस्ट्रैप और मुझे मैन्युअल रूप से नेटवर्किंग वर्किंग (नेटवर्कड) प्राप्त करना था। मेरे debootstrap लाइन था: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt
पीटर - मोनिका

जवाबों:


4

टिप्पणी नहीं कर सकते, लेकिन आपके "गाइड" ने मिनिमल उबंटू 16 थंबड्राइव बनाने के लिए अद्भुत काम किया। केवल एक चीज जो मैंने बदली, वह थी डेबस्ट्रैप और मुझे मैन्युअल रूप से नेटवर्किंग वर्किंग ( networkd) प्राप्त करना था ।

मेरी डेब्यूस्ट्रैप लाइन थी:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt

1
यदि आप इस गाइड को मान्य कर सकते हैं, तो 4-5 उत्तर ASAP लिखें, अपने लगभग 50 प्रतिनिधि प्राप्त करें, और फिर आप इसे टिप्पणी करने में सक्षम होंगे। मैं आपके पोस्ट को हटाए जाने के लिए ध्वजांकित नहीं करता, क्योंकि यह बहुत योग्य है, लेकिन मुझे करना चाहिए, क्योंकि यह वास्तव में उत्तर नहीं है। इस प्रकार, दूसरों की संभावना होगी। लेकिन आप बहुत जल्द उस 50 प्रतिनिधि को प्राप्त कर सकते हैं। 3-4 तुच्छ सवालों के जवाब दें और कल आपके पास होगा ...
पेटेर - मोनिका

हमारे यहां बहुत से शुरुआती लिनक्सर्स हैं, उनकी मदद करना रॉकेट-जैसे रेप बूस्ट का आसान तरीका है। अन्य SE साइटें इतनी आसान नहीं हैं।
पेटेर -

4

इस पर रखा और यह पता लगाया, यहाँ से अपेक्षाकृत सीधे आगे, लेकिन स्थापित करने की बात नहीं है /etc/fstab, यहाँ बाकी है:

आवश्यक नहीं है लेकिन चीजों को साफ करने के लिए एक अच्छा विचार है

apt-get autoclean

सेट अप /etc/fstab- mountयह सुनिश्चित करने के लिए कि आप सही फाइल सिस्टम प्रकार पर हैं

echo "/dev/sda1 / ext4 defaults,errors=remount-ro 0 1" > /etc/fstab

यह initramfs को फिर से बनाएगा और इसे बूट करने की अनुमति देगा

update-initramfs -u -k all

ऐसा करो और मशीन बूट साफ, QEMU में परीक्षण किया और फिर मैं इसे अभी हार्डवेयर पर चला रहा हूं।


4

बिना किसी सिस्टम त्रुटि के स्वचालित Debian 9 सेटअप

इस सेटअप में कोई भी सिस्टम त्रुटि या चेतावनी नहीं है, और मुझे अंत में इंटरनेट कनेक्शन और एक शेल मिलता है।

जब मैंने डेबिन कर्नेल का उपयोग नहीं किया है, तो यह सेटअप सही नहीं है, जब मैंने बाद के अनुभाग में समझाया। फिर मैंने बस एक कर्नेल की कोशिश की, जो मैंने बिल्डरो के आधार पर विन्यास के साथ, चारों ओर पड़ा था और यह काम किया। इस सेटअप में विन्यास प्रदान किया गया है। इसलिए, यह संभव है कि कुछ पैकेज जो लापता कर्नेल कॉन्फ़िगरेशन पर भरोसा करते हैं, विफल हो जाएंगे, हालांकि मैंने अब तक कोई त्रुटि नहीं देखी है।

एक अनुरूप सेटअप ने पूरी तरह से उबंटू कर्नेल के साथ काम किया, हालांकि: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171/811171 Ubuntu कर्नेल में गायब कॉन्फ़िगरेशन होना चाहिए डेबियन की तुलना में। डेबियन कर्नेल विफलताओं को अतिरिक्त विकल्पों के साथ डेबियन कर्नेल को संकलित करके तय किया जा सकता है जैसे CONFIG_VIRTIO_BLK=yकि मैंने उबंटू के लिए किया है।

#!/usr/bin/env bash

set -eux

debootstrap_dir=debootstrap
root_filesystem=img.ext2.qcow2

sudo apt-get install \
  debootstrap \
  libguestfs-tools \
  git \
  qemu-system-x86 \
;

if [ ! -d "$debootstrap_dir" ]; then
  # Create debootstrap directory.
  # - linux-image-amd64: downloads the kernel image
  sudo debootstrap \
    --include linux-image-amd64 \
    stretch \
    "$debootstrap_dir" \
    http://deb.debian.org/debian/ \
  ;
  sudo rm -f "$root_filesystem"
fi

if [ ! -f "$root_filesystem" ]; then
  # Set root password.
  echo 'root:root' | sudo chroot "$debootstrap_dir" chpasswd

  # Remount root filesystem as rw.
  # Otherwise, systemd shows:
  #     [FAILED] Failed to start Create Volatile Files and Directories.
  # and then this leads to further failures in the network setup.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Network.
  # We use enp0s3 because the kernel boot prints:
  #     8139cp 0000:00:03.0 enp0s3: renamed from eth0
  # This can also be observed with:
  #     ip link show
  # Without this, systemd shows many network errors, the first of which is:
  #     [FAILED] Failed to start Network Time Synchronization.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/network/interfaces.d/00mytest"
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet dhcp
EOF

  # Generate image file from debootstrap directory.
  # Leave 1Gb extra empty space in the image.
  sudo virt-make-fs \
    --format qcow2 \
    --size +1G \
    --type ext2 \
    "$debootstrap_dir" \
    "$root_filesystem" \
  ;
  sudo chmod 666 "$root_filesystem"
fi

# linux_image="$(printf "${debootstrap_dir}/boot/vmlinuz-"*)"

linux_img=linux/arch/x86_64/boot/bzImage
if [ ! -f "$linux_img" ]; then
  # Build the Linux kernel.
  git clone --depth 1 --branch v4.18 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
  cd linux
  wget https://gist.githubusercontent.com/cirosantilli/6e2f4975c1929162a86be09f839874ca/raw/6d151d231a233408a6e1b541bf4a92fd55bf5338/.config
  make olddefconfig
  make -j`nproc`
  cd -
fi

qemu-system-x86_64 \
  -append 'console=ttyS0 root=/dev/sda' \
  -drive "file=${root_filesystem},format=qcow2" \
  -enable-kvm \
  -serial mon:stdio \
  -m 2G \
  -kernel "$linux_img" \
  -device rtl8139,netdev=net0 \
  -netdev user,id=net0 \
;

गिटहब ऊपर

अब टर्मिनल से root/ के साथ लॉगिन करें root, और फिर जांचें कि इंटरनेट निम्नलिखित कमांड के साथ काम करता है:

printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80
apt-get update
apt-get install hello
hello

हमने /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#53462497nc पर बताया क्योंकि:

एक Ubuntu 18.04 होस्ट पर परीक्षण किया गया।

यदि मैं डेबियन कर्नेल का उपयोग करने की कोशिश करता हूं तो क्या होगा

TODO समझते हैं और ठीक करते हैं। अगर मैं ऊपर दिए गए लिनक्स कर्नेल संकलन के साथ लिनक्स कर्नेल संकलन को प्रतिस्थापित करता हूं:

linux_img="${debootstrap_dir}/boot/vmlinuz-"*

तब बूट विफल रहता है:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

और के लिए एक खाली सूची:

List of all partitions:

इसलिए डिस्क को बिल्कुल भी पहचाना नहीं जा रहा है। मैंने ठीक उसी कर्नेल का उपयोग करने की कोशिश की है, जो डेबियन आईएसओ इंस्टॉलर यहां स्थापित किया गया है, लेकिन डेबियन के लिए , और यह उसी तरह से विफल रहता है, भले ही डेबियन आईएसओ इंस्टॉल समान QEMU विकल्पों के साथ ठीक काम करता है (यह GRUB स्थापित करता है एक डिस्क में कई विभाजन के साथ, रूट एक ext4)।


यदि कोई भी एक ताजा उबंटू इंस्टॉल पर ऐसा कर रहा है, तो आपको build-essentialsस्क्रिप्ट चलाने से पहले इंस्टॉल करना होगा । आप याद आ रही हो जाएगा git, make, bisonऔर flex इसके अलावा अवगत ओपी GitHub config करने के लिए यहाँ में एक लिंक दिया है हो सकता है, आप इसे आँख बंद करके यकीन है कि यह तो नहीं बदल बनाने के लिए चलाने से पहले के माध्यम से इसे पढ़ने के लिए चाहते हो सकता है।
GPPK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.