Skip to content

jinsenglin/diskimage-builder

Repository files navigation

# vagrant host

vagrant up
vagrant ssh
# vagrant guest
# working dir /home/vagrant

sudo su

# install diskimage-builder
#
yum -y install epel-release
yum -y update
yum -y install python-pip qemu-img
pip install diskimage-builder==2.10.1
#

# pin base image version
#
# wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1801-01.qcow2.xz
# mv CentOS-7-x86_64-GenericCloud-1801-01.qcow2.xz CentOS-7-x86_64-GenericCloud.qcow2.xz
# python -m SimpleHTTPServer
# export DIB_CLOUD_IMAGES=http://localhost:8000/
#
# note - with cloud-init v0.7.9 inside (src download https://launchpad.net/cloud-init/trunk/0.7.9/+download/cloud-init-0.7.9.tar.gz)
#

# change disk image layout
#
# source DIB_BLOCK_DEVICE_CONFIG-for-vm-of-2-partitions
#

export DIB_DEBUG_TRACE=1
export DIB_OFFLINE=1
export OVERWRITE_OLD_IMAGE=1

export DIB_DEV_USER_PWDLESS_SUDO="yes"
export DIB_DEV_USER_USERNAME="cclin"
export DIB_DEV_USER_PASSWORD="cclin"

# Build Option 0 :: vm vs. baremetal
disk-image-create -t raw centos7 baremetal -o centos7-baremetal # The partition image command creates .raw, .vmlinuz and .initrd files.
disk-image-create -t raw centos7 vm -o centos7-baremetal # The whole disk image command creates .raw file.

# Build Option 0 :: cloud-init
disk-image-create -t raw centos7 vm selinux-permissive devuser cloud-init-nocloud -o centos7-baremetal

# Build Option 1 - custom element "cclin"
# - use "/var/lib/cloud/seed/nocloud/{meta-data,user-data}" for cloud-init datasource
export ELEMENTS_PATH=/vagrant/elements # built-in elements reside in /usr/lib/python2.7/site-packages/diskimage_builder/elements
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-nocloud cclin -o centos7-baremetal

# Build Option 1 - custom element "cloud-init-patch"
# - use "/var/lib/cloud/seed/nocloud/{meta-data,user-data}" for cloud-init datasource
export ELEMENTS_PATH=/vagrant/elements # built-in elements reside in /usr/lib/python2.7/site-packages/diskimage_builder/elements
export DIB_CLOUD_INIT_PATCH_SET_PASSWORDS=1
export DIB_CLOUD_INIT_PATCH_BOOTCMD=0
export DIB_CLOUD_INIT_PATCH_RUNCMD=1
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-nocloud cloud-init-patch -o centos7-baremetal

# Build Option 2 - custom element "docker"
# - use "/var/lib/cloud/seed/nocloud/{meta-data,user-data}" for cloud-init datasource
export ELEMENTS_PATH=/vagrant/elements
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-nocloud docker -o centos7-baremetal

# Build Option 3 - custom element "nvidia-tesla-k80-driver"
# - use "ConfigDrive" for cloud-init datasource
# - use "DIB_NVIDIA_K80_DRIVER=http://localhost:8000/nvidia-diag-driver-local-repo-rhel7-390.12-1.0-1.x86_64.rpm" to change download url if needed
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
export ELEMENTS_PATH=/vagrant/elements
export DIB_CLOUD_INIT_PATCH_SET_PASSWORDS=1
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-patch nvidia-tesla-k80-driver -o centos7-baremetal --image-size 3

# Build Option 4 - custom element "nvidia-cuda-toolkit"
# - use "ConfigDrive" for cloud-init datasource
# - use "DIB_NVIDIA_CUDA_TOOLKIT=http://localhost:8000/cuda-repo-rhel7-9.1.85-1.x86_64.rpm" to change download url if needed
# - use "DIB_NVIDIA_CUDA_TOOLKIT=http://localhost:8000/cuda-repo-rhel7-9-1-local-9.1.85-1.x86_64.rpm" to change download url if needed
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
export ELEMENTS_PATH=/vagrant/elements
export DIB_CLOUD_INIT_PATCH_SET_PASSWORDS=1
export DIB_CLOUD_INIT_PATCH_RUNCMD=1
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-patch nvidia-cuda-toolkit -o centos7-baremetal --image-size 6

# Build Option 5 - custom element "nvidia-cudnn-library"
# - use "ConfigDrive" for cloud-init datasource
# - use "DIB_NVIDIA_CUDNN_CUDA_HOME" to change cuda home if needed
# - use "DIB_NVIDIA_CUDNN_LIBRARY=http://localhost:8000/cudnn-9.1-linux-x64-v7.tgz" to change download url if needed
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
export ELEMENTS_PATH=/vagrant/elements
export DIB_CLOUD_INIT_PATCH_SET_PASSWORDS=1
export DIB_CLOUD_INIT_PATCH_RUNCMD=1
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-patch nvidia-cudnn-library -o centos7-baremetal --image-size 6

# Build Option 6 - custom element "nvidia-docker"
# - use "ConfigDrive" for cloud-init datasource
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive"
export ELEMENTS_PATH=/vagrant/elements
export DIB_CLOUD_INIT_PATCH_SET_PASSWORDS=1
export DIB_CLOUD_INIT_PATCH_RUNCMD=1
disk-image-create -t raw centos7 vm dhcp-all-interfaces selinux-permissive devuser cloud-init-patch nvidia-docker -o centos7-baremetal --image-size 6

# cache dir: /root/.cache/image-create
# base image: http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2.xz

# install libguestfs-tools
#
yum -y install libguestfs-tools libvirt
service libvirtd start
#

# Inspect Method 1 :: [ qemu-img ]
qemu-img centos7-baremetal.raw

# Sample Output
#
# image: /home/vagrant/centos7-baremetal.raw
# file format: raw
# virtual size: 3.0G (3221225472 bytes)
# disk size: 2.9G
# 

# Inspect Method 2 :: [ virt-df ]
export LIBGUESTFS_BACKEND=direct
virt-df -a centos7-baremetal.raw

# Sample Output
#
# Filesystem                           1K-blocks       Used  Available  Use%
# centos7-baremetal.raw:/dev/sda1        1781200    1142992     523716   65%
#

# To Resize /dev/sda1 at build time phase
#
# --image-size 3
#
# centos7-baremetal.raw:/dev/sda1        2881392    1187332    1520492   42%
#

# Modify Method 1 :: [ guestfish ]
export LIBGUESTFS_BACKEND=direct
guestfish --ro -a centos7-baremetal.raw
run
list-filesystems
exit

# Modify Method 2 :: [ virt-edit ]
export LIBGUESTFS_BACKEND=direct
virt-edit -a centos7-baremetal.raw /etc/hosts

# Modify Method 3 :: [ guestmount ]
export LIBGUESTFS_BACKEND=direct
guestmount -a centos7-baremetal.raw -m /dev/sda1 --ro /mnt
ls /mnt
umount /mnt

# Modify Method 4 :: [ guestmount ] + [ chroot ]
export LIBGUESTFS_BACKEND=direct
guestmount -a centos7-baremetal.raw -m /dev/sda1 --rw /mnt
mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
chroot /mnt
ls /home
exit
umount /mnt/sys
umount /mnt/dev
umount /mnt/proc
guestunmount /mnt #OR umount /mnt

# Modify Method 5 :: [ losetup ] + [ kpartx ]
losetup -f # result: /dev/loop0
losetup /dev/loop0 centos7-baremetal.raw
kpartx -av /dev/loop0 # result: add map loop0p1 (253:3): 0 3886464 linear /dev/loop0 2048
ls -l /dev/mapper/loop0p*
mount /dev/mapper/loop0p1 /mnt
ls /mnt
umount /mnt
kpartx -d /dev/loop0
losetup -d /dev/loop0

# Modify Method 6 :: [ losetup ] + [ kpartx ] + [ chroot ]
losetup -f # result: /dev/loop0
losetup /dev/loop0 centos7-baremetal.raw
kpartx -av /dev/loop0 # result: add map loop0p1 (253:3): 0 3886464 linear /dev/loop0 2048
ls -l /dev/mapper/loop0p*
mount /dev/mapper/loop0p1 /mnt
mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
chroot /mnt
ls /home
exit
umount /mnt/sys
umount /mnt/dev
umount /mnt/proc
umount /mnt
kpartx -d /dev/loop0
losetup -d /dev/loop0
cp centos7-baremetal.raw /tmp
cd /tmp
chown qemu:qemu centos7-baremetal.raw

virt-install --connect=qemu:///system --name=centos7 --ram=512 --vcpus=1 --disk path=centos7-baremetal.raw,format=raw --import --network network:default --vnc
# REF http://accelazh.github.io/virtualization/Play-With-Libvirt-KVM

cd /tmp
wget --no-check-certificate https://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img
chown qemu:qemu cirros-0.3.2-x86_64-disk.img

yum -y install virt-install virt-viewer seabios-bin
virt-install --connect=qemu:///system --name=cirros --ram=512 --vcpus=1 --disk path=cirros-0.3.2-x86_64-disk.img,format=qcow2 --import --network network:default --vnc
^z
bg

# virsh list
# ls /etc/libvirt/qemu/cirros.xml
# ps aux | grep qemu-kvm

# virsh
# console cirros
# ^]
# exit

# virsh
# destroy cirros
# exit
# virsh -c qemu:///system undefine cirros # will remove /etc/libvirt/qemu/cirros.xml too

REF https://github.com/jedi4ever/veewee/issues/996

About `chown qemu:qemu centos7-baremetal.raw`

There is another solution for this issue.

Changing /etc/libvirt/qemu.conf to make things work.
Uncomment user/group to work as root (or another user/group e.g. vagrant).

Then restart libvirtd.
# inside centos7-baremetal.raw

## create user-data and meta-data files that will be used
## to modify image on first boot

cd /var/lib/cloud/seed/nocloud

cat > meta-data <<METADATA
local-hostname: centos7
METADATA

## will setup hostname "centos7"

cat > user-data <<USERDATA
#cloud-config
password: passw0rd
chpasswd: { expire: False }
ssh_pwauth: True
USERDATA

## will setup password "passw0rd" for the cloud user specified in the /etc/cloud/cloud.cfg , which means "centos" in this case

cat > user-data <<USERDATA
#cloud-config
chpasswd:
  list: |
    root:pass2000
    centos:pass2000
  expire: False
ssh_pwauth: True
USERDATA

## will setup password "pass2000" for existing user "root"
## will setup password "pass2000" for existing user "centos"
yum -y install qemu-system-x86

qemu-system-x86_64 centos7-baremetal.raw -nographic

yum -y install vnc-server

qemu-system-x86_64 centos7-baremetal.raw -vnc :0 # netstat -plnt | grep 5900
qemu-system-x86_64 centos7-baremetal.raw -vnc :1 # netstat -plnt | grep 5901
# boot with kernel, initrd
qemu-system-x86_64 -nographic -kernel centos7-baremetal.vmlinuz -initrd centos7-baremetal.initrd -m 512 -append console=ttyS0
init 0

# boot with kernel, initrd, rootfs
qemu-system-x86_64 -nographic -kernel centos7-baremetal.vmlinuz -initrd centos7-baremetal.initrd -hda centos7-baremetal.raw -m 512 -append "root=/dev/sda console=ttyS0"
init 0

REF http://lockett.altervista.org/linuxboot/linuxboot.html

# Boot With initramfs
qemu-system-x86_64 -kernel bzImage -initrd initramfs.cpio -m 512
qemu-system-x86_64 -kernel bzImage -initrd initramfs.cpio -m 512 -append noapic
qemu-system-x86_64 -kernel bzImage -initrd initramfs.cpio -m 512 -nographic -append console=ttyS0
# v3.1
yum -y group install "Development Tools"
yum -y install python-devel
pip install python-openstackclient==3.2.1
pip install openstacksdk==0.9.5
pip install osc-lib==1.1.0
pip install keystoneauth1==2.12.3
pip install python-novaclient==6.0.0
pip install python-keystoneclient==3.5.0
pip install python-glanceclient==2.5.0
pip install python-cinderclient==1.9.0
pip install os-client-config==1.21.1
pip install python-neutronclient==6.0.0

openstack image delete bm-c7-k80
openstack image create --container-format bare --disk-format raw --unprotected --public --tag baremetal --file centos7-baremetal.raw bm-c7-k80

Addiontional Resources

.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages