온라인에 사전 구축 된 QEMU Ubuntu 이미지 (32 비트)가 있습니까?


12

QEMU와 놀고 있습니다. 여기에 미리 작성된 OS 이미지가 있습니다.

http://docs.openstack.org/trunk/openstack-compute/admin/content/starting-images.html

그러나 그들은 모두 64 비트 시스템을 의미하며 내 시스템은 32 비트입니다. 온라인에 32 비트 사전 빌드 이미지가 있는지 아는 사람이 있습니까?

따라서 직접 사용할 수 있으며 설치에 신경 쓸 필요가 없습니다.

감사.


32 비트 운영 체제 만 가질 수 있습니까? CPU에만 의존합니다.
Alvar

@ Alvar 확실하지 않습니다. 내 호스트는 커널 2.6.29가 설치된 Fedora 12입니다. 내 OS가 32 비트라고 생각합니다. 프로세서는 Intel Core 2 Duo CPU E8400입니다. "qemu-kvm -m 1024 img"명령 만 사용합니다. Img는 내가 제공 한 웹 사이트에서 다운로드됩니다. 그것은 단지 "처음 램 디스크 로딩"에서 멈췄다 ....
Hao Shen

2
예, CPU는 64 비트 호환성이 있습니다. 출처
Alvar

답변:


11

빠른 Google 검색은 다음과 계시 (내가 그들 중 하나를 시도하지 않은) :

또한 vmbuilder (여기서 참조 ubuntu-vmbuilder)를 사용하여 KVM, VirtualBox 등에 대한 Ubuntu 이미지를 빠르게 생성 할 수 있습니다.

최후의 수단으로 qemu-img명령을 사용 하여 VirtualBox / VMware에서 디스크 이미지를 QEMU / KVM에 더 적합한 형식으로 변환 할 수 있습니다 (필요하지 않을 수도 있습니다. QEMU / KVM은 vdi 또는 vmdk와 같은 다른 이미지 유형에서 작동 할 수 있다고 생각합니다).

$ qemu-img convert -f [vdi|vmdk|...] -O qcow2 OriginalImage NewImage

참고 : 32 비트 OS를 사용하는 경우 KVM으로 64 비트 가상 머신을 실행할 수 없습니다. 그러나 QEMU는 에뮬레이터이므로 32 비트 운영 체제에서 64 비트 vm을 실행할 수 있어야합니다. 그러나 성능 오버 헤드는 아마도 클 것입니다!


10

이 답변에는 다음 설정에 대한 자세한 단계가 포함되어 있습니다.

  • 클라우드 이미지 amd64 및 arm64
  • debootstrap amd64 및 arm64
  • 데스크탑 이미지 amd64

모두 18.04 명을 대상으로하는 Ubuntu 18.04 호스트에서 테스트되었습니다.

클라우드 이미지 AMD64

Ubuntu 클라우드 이미지는 일반적인 데스크탑 시스템 설치없이 직접 부팅 할 수있는 사전 설치된 이미지입니다. 참조 : /server/438611/what-are-ubuntu-cloud-images

#!/usr/bin/env bash

sudo apt-get install cloud-image-utils qemu

# This is already in qcow2 format.
img=ubuntu-18.04-server-cloudimg-amd64.img
if [ ! -f "$img" ]; then
  wget "https://cloud-images.ubuntu.com/releases/18.04/release/${img}"

  # sparse resize: does not use any extra space, just allows the resize to happen later on.
  # /superuser/1022019/how-to-increase-size-of-an-ubuntu-cloud-image
  qemu-img resize "$img" +128G
fi

user_data=user-data.img
if [ ! -f "$user_data" ]; then
  # For the password.
  # /programming/29137679/login-credentials-of-ubuntu-cloud-server-image/53373376#53373376
  # /server/920117/how-do-i-set-a-password-on-an-ubuntu-cloud-image/940686#940686
  # /ubuntu/507345/how-to-set-a-password-for-ubuntu-cloud-images-ie-not-use-ssh/1094189#1094189
  cat >user-data <<EOF
#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True
EOF
  cloud-localds "$user_data" user-data
fi

qemu-system-x86_64 \
  -drive "file=${img},format=qcow2" \
  -drive "file=${user_data},format=raw" \
  -device rtl8139,netdev=net0 \
  -enable-kvm \
  -m 2G \
  -netdev user,id=net0 \
  -serial mon:stdio \
  -smp 2 \
  -vga virtio \
;

GitHub의 상류 .

QEMU가 시작된 후 부팅 메뉴를 표시하려면 enter 키를 눌러야합니다. Ubuntu거기에서 선택하십시오 .

그런 다음 부팅 시작 부분은 다음과 같습니다.

error: no such device: root.

Press any key to continue...

그러나 아무 키도 누르지 않아도 짧은 시간 초과 후에 부팅이 계속됩니다. 이 버그 보고서를 투표하십시오 : https://bugs.launchpad.net/cloud-images/+bug/1726476

부팅이 완료되면 다음을 사용하여 로그인하십시오.

  • 사용자 이름: ubuntu
  • 암호: asdfqwer

인터넷이 정상적으로 작동합니다.

구름 이미지 arm64

TODO : 이것을 사용할 때 때때로 발생하는 버그가 있음을 알았습니다 : https://bugs.launchpad.net/cloud-images/+bug/1818197

amd64와 매우 유사하지만 부팅하려면 UEFI 블랙 매직이 필요합니다.

sudo apt-get install cloud-image-utils qemu-system-arm qemu-efi

# Get the image.
img=ubuntu-18.04-server-cloudimg-arm64.img
if [ ! -f "$img" ]; then
  wget "https://cloud-images.ubuntu.com/releases/18.04/release/${img}"
  qemu-img resize "$img" +128G
fi

# For the password.
user_data=user-data.img
if [ ! -f "$user_data" ]; then
  cat >user-data <<EOF
#cloud-config
password: asdfqwer
chpasswd: { expire: False }
ssh_pwauth: True
EOF
  cloud-localds "$user_data" user-data

  # Use the EFI magic. Picked up from:
  # https://wiki.ubuntu.com/ARM64/QEMU
  dd if=/dev/zero of=flash0.img bs=1M count=64
  dd if=/usr/share/qemu-efi/QEMU_EFI.fd of=flash0.img conv=notrunc
  dd if=/dev/zero of=flash1.img bs=1M count=64
fi

qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a57 \
  -device rtl8139,netdev=net0 \
  -m 4096 \
  -netdev user,id=net0 \
  -nographic \
  -smp 4 \
  -drive "if=none,file=${img},id=hd0" \
  -device virtio-blk-device,drive=hd0 \
  -drive "file=${user_data},format=raw" \
  -pflash flash0.img \
  -pflash flash1.img \
;

GitHub의 상류 .

debootstrap amd64

사전 제작 된 이미지는 아니지만 모든 사전 제작 된 패키지를 다운로드하므로 빠르고 빠르지 만 구성 및 유용성이 훨씬 뛰어납니다.

#!/usr/bin/env bash

set -eux

debootstrap_dir=debootstrap
root_filesystem=debootstrap.ext2.qcow2

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

if [ ! -d "$debootstrap_dir" ]; then
  # Create debootstrap directory.
  # - linux-image-generic: downloads the kernel image we will use under /boot
  # - network-manager: automatically starts the network at boot for us
  sudo debootstrap \
    --include linux-image-generic \
    bionic \
    "$debootstrap_dir" \
    http://archive.ubuntu.com/ubuntu \
  ;
  sudo rm -f "$root_filesystem"
fi

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

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

  # Remount root filesystem as rw.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Automaticaly start networking.
  # Otherwise network commands fail with:
  #     Temporary failure in name resolution
  # /ubuntu/1045278/ubuntu-server-18-04-temporary-failure-in-name-resolution/1080902#1080902
  cat << EOF | sudo tee "$debootstrap_dir/etc/systemd/system/dhclient.service"
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target
[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q
[Install]
WantedBy=multi-user.target
EOF
  sudo ln -sf "$debootstrap_dir/etc/systemd/system/dhclient.service" \
    "${debootstrap_dir}/etc/systemd/system/multi-user.target.wants/dhclient.service"

  # Why Ubuntu, why.
  # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
  sudo chmod +r "${linux_image}"

  # 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

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_image}" \
  -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

/programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497에nc 설명 된 대로 사용 했습니다 .

비슷한 데비안 버전 : /unix/275429/creating-bootable-debian-image-with-debootstrap/473256#473256

나만의 커널 만들기

우리가 여기 있기 때문에 :

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git
cd ubuntu-bionic
# Tag matches the working kernel that debootstrap downloaded for us.
git checkout Ubuntu-4.15.0-20.21
fakeroot debian/rules clean
debian/rules updateconfigs
fakeroot debian/rules build-generic
linux_image="$(pwd)/debian/build/build-generic/arch/x86_64/boot/bzImage"

이것은 정확히 동일한 구성을 생성했으며 다음 debootstrap과 같이 다운로드 한 패키지 우분투와 정확히 동일한 소스 코드를 사용했다고 생각 합니다. 11.04 커널 .config 파일은 어디서 얻을 수 있습니까?

그런 다음 패치했습니다.

diff --git a/init/main.c b/init/main.c
index b8b121c17ff1..542229349efc 100644
--- a/init/main.c
+++ b/init/main.c
@@ -516,6 +516,8 @@ asmlinkage __visible void __init start_kernel(void)
        char *command_line;
        char *after_dashes;

+ pr_info("I'VE HACKED THE LINUX KERNEL!!!");
+
        set_task_stack_end_magic(&init_task);
        smp_setup_processor_id();
        debug_objects_early_init();

다시 빌드하십시오.

fakeroot debian/rules build-generic

부팅하는 동안 메시지가 인쇄되었습니다.

I'VE HACKED THE LINUX KERNEL!!!

재건은 그리 빠르지 않았으므로 더 나은 명령이 있습니까? 방금 말하기를 기다렸습니다.

Kernel: arch/x86/boot/bzImage is ready  (#3)

그리고 달리기를 계속했다.

부트 스트랩 암 64

절차는 amd64와 유사하지만 다음과 같은 차이점이 있습니다.

1)

우리는 두 단계를 수행해야합니다 debootstrap:

  • 먼저 --foreign패키지를 다운로드하는 것
  • 그런 다음 QEMU static을 chroot
  • 그런 다음 --second-stageQEMU 사용자 모드 에뮬레이션 을 사용하여 패키지 설치를 수행합니다.binfmt_misc

참조 : debootstrap이란 무엇입니까?

2) 기본 커널 부팅은 다음과 같이 실패합니다 :

[    0.773665] Please append a correct "root=" boot option; here are the available partitions:
[    0.774033] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

빈 파티션 목록은 누락 된 옵션을 시도한 후 디스크 드라이버에 심각한 오류가 있음을 나타냅니다.

CONFIG_VIRTIO_BLK=y

모듈을 initrd에서로드해야하기 때문에 ISO를 사용할 때 작동한다고 생각합니다.

다른 디스크 유형을 사용하려고했지만 virtio는 현재 유일한 시스템 유형 인 -drive if=when에 유효한 값입니다 -M virt.

그러므로 우리는 여기에 설명 된대로 활성화 된 옵션을 사용하여 우리 자신의 커널을 다시 컴파일해야 합니다.

우분투 개발자는 y기본적 으로이 CONFIG 를 설정 해야합니다 ! 매우 유용합니다!

TODO : 네트워크가 작동하지 않습니다. 오류 메시지는 다음과 같습니다.

root@ciro-p51:~# systemctl status dhclient.service
root@ciro-p51:~# cat f
● dhclient.service - DHCP Client
   Loaded: loaded (/etc/systemd/system/dhclient.service; enabled; vendor preset: enabled)
   Active: failed (Result: protocol) since Sun 2018-01-28 15:58:42 UTC; 2min 2s ago
     Docs: man:dhclient(8)
  Process: 171 ExecStart=/sbin/dhclient -4 -q (code=exited, status=0/SUCCESS)

Jan 28 15:58:40 ciro-p51 systemd[1]: Starting DHCP Client...
Jan 28 15:58:42 ciro-p51 dhclient[171]: No broadcast interfaces found - exiting.
Jan 28 15:58:42 ciro-p51 systemd[1]: dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directory
Jan 28 15:58:42 ciro-p51 systemd[1]: dhclient.service: Failed with result 'protocol'.
Jan 28 15:58:42 ciro-p51 systemd[1]: Failed to start DHCP Client.

완전 자동화 된 스크립트는 다음과 같습니다.

#!/usr/bin/env bash

# /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171

set -eux

debootstrap_dir=debootstrap
root_filesystem=debootstrap.ext2.qcow2

sudo apt-get install \
  gcc-aarch64-linux-gnu \
  debootstrap \
  libguestfs-tools \
  qemu-system-aarch64 \
  qemu-user-static \
;

if [ ! -d "$debootstrap_dir" ]; then
  sudo debootstrap \
    --arch arm64 \
    --foreign \
    bionic \
    "$debootstrap_dir" \
    http://ports.ubuntu.com/ubuntu-ports \
  ;
  sudo mkdir -p "${debootstrap_dir}/usr/bin"
  sudo cp "$(which qemu-aarch64-static)" "${debootstrap_dir}/usr/bin"
  sudo chroot "$debootstrap_dir" /debootstrap/debootstrap --second-stage
  sudo rm -f "$root_filesystem"
fi

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

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

  # Remount root filesystem as rw.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Automaticaly start networking.
  # Otherwise network commands fail with:
  #     Temporary failure in name resolution
  # /ubuntu/1045278/ubuntu-server-18-04-temporary-failure-in-name-resolution/1080902#1080902
  cat << EOF | sudo tee "${debootstrap_dir}/etc/systemd/system/dhclient.service"
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target

[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q

[Install]
WantedBy=multi-user.target
EOF
  sudo ln -sf "${debootstrap_dir}/etc/systemd/system/dhclient.service" \
    "${debootstrap_dir}/etc/systemd/system/multi-user.target.wants/dhclient.service"

  # Why Ubuntu, why.
  # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/759725
  sudo chmod +r "${linux_image}"

  # 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

# Build the Linux kernel.
linux_image="$(pwd)/linux/debian/build/build-generic/arch/arm64/boot/Image"
if [ ! -f "$linux_image" ]; then
  git clone --branch Ubuntu-4.15.0-20.21 --depth 1 git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git linux
  cd linux
patch -p1 << EOF
diff --git a/debian.master/config/config.common.ubuntu b/debian.master/config/config.common.ubuntu
index 5ff32cb997e9..8a190d3a0299 100644
--- a/debian.master/config/config.common.ubuntu
+++ b/debian.master/config/config.common.ubuntu
@@ -10153,7 +10153,7 @@ CONFIG_VIDEO_ZORAN_ZR36060=m
 CONFIG_VIPERBOARD_ADC=m
 CONFIG_VIRTIO=y
 CONFIG_VIRTIO_BALLOON=y
-CONFIG_VIRTIO_BLK=m
+CONFIG_VIRTIO_BLK=y
 CONFIG_VIRTIO_BLK_SCSI=y
 CONFIG_VIRTIO_CONSOLE=y
 CONFIG_VIRTIO_INPUT=m
EOF
  export ARCH=arm64
  export $(dpkg-architecture -aarm64)
  export CROSS_COMPILE=aarch64-linux-gnu-
  fakeroot debian/rules clean
  debian/rules updateconfigs
  fakeroot debian/rules DEB_BUILD_OPTIONS=parallel=`nproc` build-generic
  cd -
fi

qemu-system-aarch64 \
  -append 'console=ttyAMA0 root=/dev/vda rootfstype=ext2' \
  -device rtl8139,netdev=net0 \
  -drive "file=${root_filesystem},format=qcow2" \
  -kernel "${linux_image}" \
  -m 2G \
  -netdev user,id=net0 \
  -serial mon:stdio \
  -M virt,highmem=off \
  -cpu cortex-a57 \
  -nographic \
;

GitHub 업스트림 .

데스크탑 이미지

QEMU에서 Ubuntu 데스크탑을 실행하는 방법을 참조하십시오.

설치 프로그램을 수동으로 수행해야하지만 가능하면 가장 안정적인 작업이며 대화 형으로 사용할 수있는 VM을 수시로 실행하려는 경우에는 좋습니다.

aarch64의 경우 데스크톱이 작동하지 않지만 QEMU에서 Ubuntu 16.04 ARM을 실행하는 방법을 주시하십시오 .


1
스크립트를 약간 수정했습니다. gist.github.com/lnyng/8342947a1d5455303fd8730c9ca35da0 주요 변경 사항은 네트워크 관리자 설치를 피하기 위해 dhclient 시스템 장치를 만드는 것입니다.
lyang

@lyang 감사합니다! 한 번 더
체계적으로 배울 수 없었습니다

@lyang 업데이트 된 답변에 설명 된대로 arm64에 대해 시도했을 때 오류가 발생 dhclient.service: Can't open PID file /var/run/dhclient.pid (yet?) after start: No such file or directory합니다. 부팅 후 나는 할 수있다 touch /var/run/a.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

권한 오류 인 것 같습니다. 어쩌면 pid 경로를 /tmp/dhclient.pid와 같은 다른 장소로 변경 하시겠습니까? 아니면 우리가 그 과정을 죽이려하지 않는다면 완전히 제거하십시오.
lyang


0

https://www.turnkeylinux.org/ 는 오랫동안 사용되었습니다. 이들은 수많은 형식의 이미지 (ova, iso, vdmk, openstack, xen)와 같은 거대한 카탈로그 다운로드 가능, 사전 제작 된 "기기"를 가지고 있습니다. 심지어 AWS에서 바로 이미지를 시작할 수도 있습니다.

특정 스택 탐색을 시작하거나 문제를 해결해야 할 때 종종 이미지를 다운로드하여 cow2로 변환하여 사용합니다.

https://app.vagrantup.com/boxes/search 또는 https://virtualboxes.org/images/ 에서 이미지를 가져 와서 변환 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.