现在的云虚拟化环境越来越多,经常会碰到需要修改并重新打包新的ISO或QCOW2镜像文件。通过手工的方式会比较麻烦,所以在镜像发布的生产环境中可以利用Jenkins来进行定期打包发布,以下介绍Jenkins环境中打包ISO/QCOW2镜像时的一些步骤和注意事项。(本处仅描述已经有QCOW2镜像的情况,如果没有QCOW2镜像的话需要新创建镜像,后续再添加从零创建镜像的过程)

配置打包ISO镜像

打包ISO镜像的过程比较简单,将命令写成一个脚本执行即可:

  1. [root@localhost vfw]$ cat build_iso.sh
  2. #!/bin/sh
  3.  
  4. mkisofs -J -l -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size -boot-info-table -z -iso-level -o ./image/vfw.iso -joliet-long vfw_iso/
    #vfw_iso路径下存放的是要打包的grub文件、内核文件以及其他一些需要的文件,具体视打包需要而定

配置打包QCOW2镜像

依赖,如果没有安装qemu通过apt-get install qemu安装最新版本即可:

nbd

qemu-nbd

qemu-img

1、给Jenkins用户取消执行shell需要控制终端;

修改/etc/sudoers配置文件(先执行chmod u+w sudoers增加写权限):

  1. # Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
  2. # You have to run "ssh -t hostname sudo <cmd>".
  3. #
  4. Defaults:jenkins !requiretty #指定用户jenkins不需要控制终端
  5. Defaults visiblepw #避免出现"no askpass program specified"报错  

2、给Jenkins用户添加执行shell的权限;

修改/etc/sudoers配置文件,给jenkins增加所有需要执行的命令权限,且执行时不需要输入密码:

  1. ## The COMMANDS section may have other options added to it.
  2. ##
  3. ## Allow root to run any commands anywhere
  4. root ALL=(ALL) ALL
  5. jenkins ALL=NOPASSWD: /usr/bin/qemu-nbd,/usr/bin/mount,/usr/bin/umount,/usr/sbin/modprobe,/usr/bin/cp,/usr/bin/sudo,/usr/bin/srm,/home/builder1/vfw/build_qcow2.sh,/usr/bin/qemu-img

执行chmod u-w sudoers关闭写权限

添加构建脚本

Jenkins构建中添加打包执行的shell,例如;

  1. export LC_CTYPE="zh_CN.UTF-8"
  2. export PATH=$PATH:/usr/local/x86_64/bin/
  3. day=`date +%Y%m%d`
  4.  
  5. #加载nbd模块
  6. sudo modprobe nbd max_part=16  #注意如果不添加max_part=16参数,在挂载镜像分区时可能会无法看到磁盘里面的实际分区,例如/dev/nbd0p1
  7.  
  8. #打包ISO镜像
  9. \cp -rf images/*.img /home/builder1/vfw/vfw_iso/
  10. cd /home/builder1/vfw/
  11. ./build_iso.sh
  12.  
  13. #打包QCOW2镜像
  14. \cp -rf images/*.img /home/builder1/vfw/vfw_qcow2/
  15. cd /home/builder1/vfw/
  16. sudo ./build_qcow2.sh
  17. umount -fl /mnt10  #强制卸载
  18. sudo qemu-nbd -d /dev/nbd0
  19. sudo qemu-img convert -c -f qcow2 -O qcow2 /home/builder1/vfw/image/vfw.qcow2 /home/builder1/vfw/image/vfw_new.qcow2  #压缩文件

build_qcow2.sh说明:

  1. #!/bin/sh
  2.  
  3. qemu-nbd -c /dev/nbd0 ./image/vfw.qcow2  #将qcow2镜像映射为网络设备
  4. mount /dev/nbd0p1 /mnt10  #挂载分区,如果有多个分区要操作就分别挂载到不同的路径下
  5. \cp ./vfw_qcow2/*.img /mnt10/boot/
  6. cd /mnt10
  7. dd if=/dev/zero of=zero  #无用的空间写0,避免多次操作镜像后镜像文件不断变大
  8. srm -rf zero  #删除zero文件

利用Jenkins打包ISO和QCOW2镜像文件的更多相关文章

  1. 利用Jenkins打包并远程部署NodeJS应用

    本文Jenkins版本2.190.2,为19年11月最新 1.安装Jenkins.Git和NodeJS Jenkins安装参考:https://www.cnblogs.com/zhi-leaf/p/1 ...

  2. 利用Jenkins打包并远程部署SpringBoot应用

    本文Jenkins版本2.190.2,为19年11月最新 1.安装Jenkins.Git.Maven和JDK Jenkins安装参考:https://www.cnblogs.com/zhi-leaf/ ...

  3. (.iso)光盘镜像文件的打开与安装

    直接解压就可以打开,然后就可以安装.exe文件

  4. QEMU 使用的镜像文件:qcow2 与 raw

    qcow2 的基本原理 qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像.它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘.与普通的 raw 格式的镜像相比,有以下特性: 更小的空间 ...

  5. Android系统的镜像文件的打包过程

    在前面一篇文章中,我们分析了Android模块的编译过程.当Android系统的所有模块都编译好之后,我们就可以对编译出来的模块文件进行打包了.打包结果是获得一系列的镜像文件,例如system.img ...

  6. (转)QEMU 使用的镜像文件:qcow2 与 raw

    原文:https://www.ibm.com/developerworks/cn/linux/1409_qiaoly_qemuimgages/ qcow2 的基本原理 qcow2 镜像格式是 QEMU ...

  7. [图文] Fedora 28 使用 Virt-Manager 制作并优化QCOW2镜像——Windows 10 1709

    实验说明: 云计算的发展使得桌面上云,windows 10就必不可少,这一章就如何制作QCOW2镜像文件并优化进行说明. 实验环境: 宿主机系统   :Fedora 28 WorkStation 虚拟 ...

  8. 【转载】深入理解OpenStack-手动制作qcow2镜像

    深入理解OpenStack-手动制作qcow2镜像 2018-01-18 手动制作镜像 1 官方虽提供qcow2系统镜像,但对于有需求的企业来说,还是定制镜像比较靠谱,下面就手动定制一个镜像 给虚拟机 ...

  9. 镜像文件挂载及本地yum搭建

    环境:centos7.2 背景:企业内网不能上网,需安装软件以及软件之间的依赖问题 解决方案:下载和企业内网服务器相同版本的centos7.2镜像文件完整版(不是最小化的iso) 挂载镜像文件 1.上 ...

随机推荐

  1. 使用SVPullToRefresh实现下拉刷新和下拉加载

    移动端开发中,“下拉刷新”和“上拉加载更多”早已在各大App中随处可见.也非常容易就能找到直接可供使用的第三方资源.譬如EGOTableViewPullRefresh(下拉刷新)和LoadMoreTa ...

  2. liunx下的权限详解

    用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建 ...

  3. 【旧文章搬运】Windows内核常见数据结构(内核对象)

    原文发表于百度空间,2008-7-23========================================================================== 继续学习,继 ...

  4. HDU - 2828 网络流

    题目大意 有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮 有的灯在开关关的时候亮,[每个开关最多对应两盏灯],试找出一种开关的ON,OFF状态,使得所有灯 ...

  5. 019--python内置函数

    一.内置高阶函数 map函数:接收两个数据 函数和序列,map()将函数调用'映射'到序列身上,并返回一个含有所有返回值的一个列表 num1 = [1,2,3,4,5] num2 = [5,4,3,2 ...

  6. Linux中的gdb调试方法总结

  7. JAVA基础-面向对象07

    一.代码块 1. 含义: 就是使用大括号括起来的一段代码 格式 { 代码: } 2.静态代码块 格式 static{ 代码: } 书写位置: 直接书写在类中成员位置: 怎么执行呢? 在类加载的最后一步 ...

  8. poj 2774 Long Long Message【SA】

    把两个串接到一起求一个SA,然后找最大的sa[i]和sa[i-1]不是一个串的he[i] #include<iostream> #include<cstdio> #includ ...

  9. bzoj 1823: [JSOI2010]满汉全席【2-SAT+tarjan】

    因为每种食材只有一份,所以两个评委的如果有要求同一种食材的两种做法就是不可行,用这个来建立2-SAT模型 然后跑tarjan判可行性即可 #include<iostream> #inclu ...

  10. yield 为什么不能进入回调函数

    操他妈的, allowed_domains = ['voice.hupu.com'] 这里面必须是域名,而不能是个路径,遇见问题不要瞎几把想,及时Google才是正道!!!!!!!!!11 感谢: h ...