이 답변에는 다음 설정에 대한 자세한 단계가 포함되어 있습니다.
- 클라우드 이미지 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-stage
QEMU 사용자 모드 에뮬레이션 을 사용하여 패키지 설치를 수행합니다.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을 실행하는 방법을 주시하십시오 .