실수:

실수:

지난 이틀 동안 부팅 가능한 데비안(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

--comminents 사용에 대한 정보 소스

  • 커널이 설치되어 있는지 확인하세요. 아래에 나타나야 합니다. /boot chroot 내에서는 /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
      

chroot 설정

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

chroot 종료

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-passwordPermitRootLogin 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

복구(오류가 발생한 경우에만 필요)

문제가 발생했거나 다시 시도해야 하는 경우 기존 CHROOT에 CHROOT을 다시 설치/설정하세요. .img:

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

테스트 이미지

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

답변1

시스템 오류 없이 Debian 9 설정을 자동화하세요

이 설정은 시스템 오류나 경고 없이 작동했으며 마침내 인터넷에 연결되고 셸이 생겼습니다.

나는 데비안 커널을 사용하지 않기 때문에 이 설정은 완벽하지 않으며, 시도했을 때 발생한 오류는 이후 섹션에서 설명할 것입니다. 그런 다음 기존 커널 중 하나를 시도하고 구성했습니다.빌드 루트 기반효과가 있었습니다. 이 설정에서는 구성이 제공됩니다. 따라서 지금까지 어떤 오류도 발견하지 못했지만 누락된 커널 구성에 의존하는 일부 패키지는 실패할 수 있습니다.

그러나 비슷한 설정이 Ubuntu 커널에서도 완벽하게 작동합니다.https://askubuntu.com/questions/281763/is-there-any-prebuild-qemu-ubuntu-image32bit-online/1081171#1081171Ubuntu 커널에는 Debian에 비해 일부 구성이 확실히 누락되어 있습니다. 데비안 커널 결함은 CONFIG_VIRTIO_BLK=y제가 Ubuntu에서 했던 것처럼 추가 옵션을 사용하여 데비안 커널을 컴파일하여 해결할 수 있습니다 .

#!/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 \
;

GitHub 업스트림.

이제 터미널에서 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

nc아래 설명대로 사용 합니다https://stackoverflow.com/questions/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497왜냐하면:

Ubuntu 18.04 호스트에서 테스트되었습니다.

데비안 커널을 사용하려고 하면 어떻게 되나요?

TODO 이해하고 수정하세요. 위의 Linux 커널 컴파일을 Debian 패키지 Linux 커널로 바꾸는 경우:

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:

따라서 디스크를 전혀 인식할 수 없습니다. 또한 Debian ISO 설치 프로그램에서 설치한 것과 동일한 커널을 사용해 보았습니다.여기서 한 것과 같지만 데비안의 경우, Debian ISO 설치가 동일한 QEMU 옵션으로 제대로 작동하더라도 동일한 방식으로 실패합니다(여러 파티션이 있는 디스크에 GRUB 설치를 생성하며 루트 파티션은 하나입니다 ext4).

답변2

가만히 서서 알아보세요. 여기서부터는 비교적 간단하지만 단지 설정 문제가 아니라 /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에서 테스트되었으며 이제 하드웨어에서 실행됩니다.

답변3

논평할 수는 없지만 귀하의 "가이드"는 최소한의 Ubuntu 16 썸 드라이브를 만드는 데 놀라운 일을 했습니다. 내가 변경한 유일한 것은 debootstrap이었고 네트워크가 수동으로 작동하도록 해야 했습니다( networkd).

내 debootstrap 라인은 다음과 같습니다

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

관련 정보