成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用 Overlay2 或 Bind 快速重構(gòu) ISO 鏡像

系統(tǒng) Linux
自從換了新工作之后,則開始負(fù)責(zé) 超融合產(chǎn)品[3] 集群部署相關(guān)工作,因此也會(huì)接觸很多鏡像,不過這個(gè)鏡像是操作系統(tǒng)的 ISO 鏡像而不是容器鏡像 ??。雖然兩者都統(tǒng)稱為鏡像,但兩者有著本質(zhì)的區(qū)別。

筆者之前在字節(jié)跳動(dòng)的時(shí)候是負(fù)責(zé) PaaS 容器云平臺(tái)的私有化部署相關(guān)的工作,所以經(jīng)常會(huì)和一些容器鏡像打交道,對(duì)容器鏡像也有一些研究,之前還寫過不少博客文章。比如 深入淺出容器鏡像的一生[1]、overlay2 在打包發(fā)布流水線中的應(yīng)用[2] 等等。

自從換了新工作之后,則開始負(fù)責(zé) 超融合產(chǎn)品[3] 集群部署相關(guān)工作,因此也會(huì)接觸很多鏡像,不過這個(gè)鏡像是操作系統(tǒng)的 ISO 鏡像而不是容器鏡像 ??。雖然兩者都統(tǒng)稱為鏡像,但兩者有著本質(zhì)的區(qū)別。

首先兩者構(gòu)建的方式有本質(zhì)的很大的區(qū)別,ISO 鏡像一般使用 mkisofs 或者 genisoimage 等命令將一個(gè)包含操作系統(tǒng)安裝所有文件目錄構(gòu)建為一個(gè) ISO 鏡像;而容器鏡像構(gòu)建則是根據(jù) Dockerfile 文件使用相應(yīng)的容器鏡像構(gòu)建工具來一層一層構(gòu)建;

另外 ISO 鏡像掛載后是只讀的,這就意味著如果想要修改 ISO 鏡像中的一個(gè)文件(比如 kickstart 文件),則需要先將 ISO 鏡像中的所有內(nèi)容復(fù)制到一個(gè)可以讀寫的目錄中,在這個(gè)讀寫的目錄中進(jìn)行修改和重新構(gòu)建 ISO 操作。

╭─root@esxi-debian-devbox ~/build
╰─# mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/iso
mount: /mnt/iso: WARNING: device write-protected, mounted read-only.
╭─root@esxi-debian-devbox ~/build
╰─# touch /mnt/iso/kickstart.cfg
touch: cannot touch '/mnt/iso/kickstart.cfg': Read-only file system

在日常工作中經(jīng)常會(huì)對(duì)一些已有的 ISO 鏡像進(jìn)行重新構(gòu)建,重新構(gòu)建 ISO 的效率根據(jù)不同的方式也會(huì)有所不同,本文就整理了三種不同重新構(gòu)建 ISO 鏡像的方案供大家參考。

常規(guī)方式

以下是按照 RedHat 官方文檔 WORKING WITH ISO IMAGES[4] 中的操作步驟進(jìn)行 ISO 重新構(gòu)建。

  • 首先我們下載一個(gè) ISO 文件,這里以 CentOS-7-x86_64-Minimal-2009.iso[5] 為例,下載好之后將它掛載到本地 /mnt/iso 目錄下;
╭─root@esxi-debian-devbox ~/build
╰─# mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/iso
mount: /mnt/iso: WARNING: device write-protected, mounted read-only.
  • 將 ISO 里的所有文件復(fù)制到另一個(gè)目錄
╭─root@esxi-debian-devbox ~/build
╰─# rsync -avrut --force /mnt/iso/ /mnt/build/
  • 進(jìn)入到該目錄下修改或新增文件,然后重新構(gòu)建 ISO 鏡像
# 使用 genisoimage 命令構(gòu)建 ISO 鏡像,在 CentOS 上可以使用 mkisofs 命令,參數(shù)上會(huì)有一些差異
╭─root@esxi-debian-devbox ~/build
╰─# genisoimage -U -r -v -T -J -joliet-long -V "CentOS 7 x86_64" -volset "CentOS 7 x86_64" -A "CentOS 7 x86_64" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -no-emul-boot -o /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso .
Total translation table size: 124658
Total rockridge attributes bytes: 55187
Total directory bytes: 100352
Path table size(bytes): 140
Done with: The File(s) Block(s) 527985
Writing: Ending Padblock Start Block 528101
Done with: Ending Padblock Block(s) 150
Max brk space used a4000
528251 extents written (1031 MB)
# 給 ISO 鏡像生成 md5 校驗(yàn)
╭─root@esxi-debian-devbox ~/build
╰─# implantisomd5 /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso
Inserting md5sum into iso image...
md5 = 9ddf5277bcb1d8679c367dfa93f9b162
Inserting fragment md5sums into iso image...
fragmd5 = f39e2822ec1ae832a69ae399ea4bd3e891eeb31e9deb9c536f529c15bbeb
frags = 20
Setting supported flag to 0

對(duì)于 ISO 鏡像比較小或者該操作不是很頻繁的情況下按照這種方式是最省事兒的,但如果是 ISO 鏡像比較大,或者是在 CI/CD 流水線中頻繁地重新構(gòu)建鏡像,每次都要 cp 復(fù)制原 ISO 鏡像的內(nèi)容確實(shí)比較浪費(fèi)時(shí)間。那有沒有一個(gè)更加高效的方法呢 ???

經(jīng)過一番摸索,折騰出來兩種可以避免使用 cp 復(fù)制這種占用大量 IO 操作的構(gòu)建方案,可以根據(jù)不同的場(chǎng)景進(jìn)行選擇。

overlay2

熟悉 docker 鏡像的應(yīng)該都知道鏡像是只讀的,使用鏡像的時(shí)候則是通過聯(lián)合掛載的方式將鏡像的每一層 layer 掛載為只讀層,將容器實(shí)際運(yùn)行的目錄掛載為讀寫層,而容器運(yùn)行期間在讀寫層的所有操作不會(huì)影響到鏡像原有的內(nèi)容。容器鏡像掛載的方式使用最多的是 overlay2 技術(shù),在 overlay2 在打包發(fā)布流水線中的應(yīng)用[6] 和 ??深入淺出容器鏡像的一生 中咱曾對(duì)它進(jìn)行過比較深入的研究和使用,對(duì) overlay2 技術(shù)感興趣的可以翻看一下這兩篇博客,本文就不再詳解其中的技術(shù)原理了,只對(duì)使用 overlay2 技術(shù)重新構(gòu)建 ISO 鏡像的可行性進(jìn)行一下分析。

  • 首先是創(chuàng)建 overlay2 掛載所需要的幾個(gè)目錄
╭─root@esxi-debian-devbox ~
╰─# mkdir -p /mnt/overlay2/{lower,upper,work,merged}
╭─root@esxi-debian-devbox ~
╰─# cd /mnt/overlay2
  • 接著將 ISO 鏡像掛載到 overlay2 的只讀層 lower 目錄
╭─root@esxi-debian-devbox /mnt/overlay2
╰─# mount -o loop /root/build/CentOS-7-x86_64-Minimal-2009.iso lower
mount: /mnt/overlay2/lower: WARNING: device write-protected, mounted read-only.
  • 使用 mount 命令掛載 overlay2 文件系統(tǒng),掛載點(diǎn)為 merged 目錄
╭─root@esxi-debian-devbox /mnt/overlay2
╰─# mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
╭─root@esxi-debian-devbox /mnt/overlay2
╰─# cd merged
  • 新增一個(gè) kickstart.cfg 文件,然后重新構(gòu)建 ISO 鏡像
╭─root@esxi-debian-devbox /mnt/overlay2/merged
╰─# echo '# this is a kickstart config file' > kickstart.cfg
╭─root@esxi-debian-devbox /mnt/overlay2/merged
╰─# genisoimage -U -r -v -T -J -joliet-long -V "CentOS 7 x86_64" -volset "CentOS 7 x86_64" -A "CentOS 7 x86_64" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -no-emul-boot -o /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso .
Total translation table size: 124658
Total rockridge attributes bytes: 55187
Total directory bytes: 100352
Path table size(bytes): 140
Done with: The File(s) Block(s) 527985
Writing: Ending Padblock Start Block 528101
Done with: Ending Padblock Block(s) 150
Max brk space used a4000
528251 extents written (1031 MB)
  • 掛載新的 ISO 鏡像驗(yàn)證后發(fā)現(xiàn)確實(shí)可行
╭─root@esxi-debian-devbox /mnt/overlay2/merged
╰─# mount -o loop /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso /mnt/newiso
mount: /mnt/newiso: WARNING: device write-protected, mounted read-only.
╭─root@esxi-debian-devbox /mnt/overlay2/merged
╰─# cat /mnt/newiso/kickstart.cfg
# this is a kickstart config file

mount --bind

前面講到了使用 overlay2 的方式避免復(fù)制原鏡像內(nèi)容進(jìn)行重新構(gòu)建鏡像的方案,但是 overlay2 對(duì)于不是很熟悉的人來講還是比較復(fù)雜,光 lowerdir、upperdir、workdir、mergeddir 這四個(gè)文件夾的作用和原理就把人直接給整不會(huì)了。那么還有沒有更為簡(jiǎn)單一點(diǎn)的方式呢?

別說還真有,只不過這種方式的用途比較局限。如果僅僅是用于修改 ISO 中的一個(gè)文件或者目錄,可以將該文件或目錄以 bind 掛載的方式將它掛載到 ISO 目錄目錄對(duì)應(yīng)的文件上。

原理就是雖然 ISO 目錄本身是只讀的,但它里面的文件和目錄是可以作為一個(gè)掛載點(diǎn)的。也就是說我把文件 A 掛載到文件 B,并不是在修改文件 B,這就是 Unix/Linux 文件系統(tǒng)十分奇妙的地方。同樣運(yùn)用 bind 掛載的還有 docker 的 volume 以及 pod 的 volume 也是運(yùn)用同樣的原理,以 bind 的方式將宿主機(jī)上的目錄或文件掛載到容器運(yùn)行對(duì)應(yīng)的目錄上。對(duì)于修改只讀 ISO 里的文件/目錄我們當(dāng)然也可以這樣做。廢話不多說來實(shí)踐驗(yàn)證一下:

  • 首先依舊是將 ISO 鏡像掛載到 /mn/iso 目錄
╭─root@esxi-debian-devbox ~/build
╰─# mount -o loop CentOS-7-x86_64-Minimal-2009.iso /mnt/iso
mount: /mnt/iso: WARNING: device write-protected, mounted read-only.
  • 接著創(chuàng)建一個(gè) /mnt/files/ks.cfg 文件,并寫入我們需要的內(nèi)容
╭─root@esxi-debian-devbox ~/build
╰─# mkdir -p /mnt/files
╭─root@esxi-debian-devbox ~/build
╰─# echo '# this is a kickstart config file' > /mnt/files/ks.cfg
  • 接著以 mount --bind 的方式掛載新建的文件到 ISO 的 EULA 文件
╭─root@esxi-debian-devbox /mnt/build
╰─# mount --bind /mnt/files/ks.cfg /mnt/iso/EULA
╭─root@esxi-debian-devbox /mnt/build
╰─# cat /mnt/iso/EULA
# this is a kickstart config file
  • 可以看到原來 ISO 文件中的 EULA 文件已經(jīng)被成功替換成了我們修改的文件,然后再重新構(gòu)建一下該 ISO 鏡像
╭─root@esxi-debian-devbox /mnt/iso
╰─# genisoimage -U -r -v -T -J -joliet-long -V "CentOS 7 x86_64" -volset "CentOS 7 x86_64" -A "CentOS 7 x86_64" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -no-emul-boot -o /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso .
  • 然后我們?cè)僦匦聮燧d新的 ISO 文件驗(yàn)證一下是否可以
╭─root@esxi-debian-devbox /mnt/iso
╰─# mkdir /mnt/newiso
╭─root@esxi-debian-devbox /mnt/iso
╰─# mount -o loop /mnt/CentOS-7-x86_64-Minimal-2009-dev.iso /mnt/newiso
mount: /mnt/newiso: WARNING: device write-protected, mounted read-only.
╭─root@esxi-debian-devbox /mnt/iso
╰─# cat /mnt/newiso/EULA
# this is a kickstart config file

驗(yàn)證通過,確實(shí)可以!不過這種方式很局限,比較適用于修改單個(gè)文件如 kickstart.cfg,如果是要新增文件那還是使用上文提到的 overlay2 的方式更為方便一些。

收獲

雖然 ISO 鏡像和容器鏡像二者有著本質(zhì)的差別,但對(duì)于只讀和聯(lián)合掛載的這些特性二者可以相互借鑒滴。

不止如此 overlay2 這種聯(lián)合掛載的特性,還可以用在其他地方。比如我有一個(gè)公共的 NFS 共享服務(wù)器,共享著一些目錄,所有人都可以以 root 用戶并以讀寫的權(quán)限進(jìn)行 NFS 掛載。這種情況下很難保障一些重要的文件和數(shù)據(jù)被誤刪。這時(shí)候就可以使用 overlay2 的方式將一些重要的文件數(shù)據(jù)掛載為 overlay2 的 lowerdir 只讀層,保證這些數(shù)據(jù)就如容器鏡像一樣,每次掛載使用的時(shí)候都作為一個(gè)只讀層。所有的讀寫操作都在 overlay2 的 merged 那一層,不會(huì)真正影響到只讀層的內(nèi)容。

草草地水了一篇博客,是不是沒有用的知識(shí)又增加了 ??

推薦閱讀

  • overlayfs.txt[7]
  • Docker 存儲(chǔ)驅(qū)動(dòng)—Overlay/Overlay2「譯」[8]
  • 聊一聊 ISO 9660[9]
  • WORKING WITH ISO IMAGES[10]
  • overlay2 在打包發(fā)布流水線中的應(yīng)用[11]
  • mount 命令之 --bind 掛載參數(shù)[12]
責(zé)任編輯:龐桂玉 來源: 奇妙的Linux世界
相關(guān)推薦

2024-04-15 12:59:44

Docker存儲(chǔ)

2020-10-30 10:49:37

DockerGPULinux

2019-11-06 16:30:26

Windows 10Windows系統(tǒng)更新

2010-01-06 18:29:55

Ubuntu iSO

2011-05-03 09:55:27

掃描儀

2009-12-31 16:01:35

Ubuntu ISO

2019-10-24 09:45:03

Pandas數(shù)據(jù)分析重構(gòu)

2019-08-12 14:04:51

2010-01-06 17:22:13

Ubuntu iso

2010-03-05 14:26:08

Ubuntu硬盤安裝

2021-06-17 09:50:45

Docker Buil系統(tǒng)架構(gòu)Linux

2013-05-22 10:30:57

SDN軟件定義網(wǎng)絡(luò)網(wǎng)絡(luò)架構(gòu)

2009-07-03 09:35:57

Struts2 JSP

2009-05-12 08:51:31

微軟Windows 7操作系統(tǒng)

2023-07-14 16:45:56

Linux鏡像

2010-03-03 16:08:42

Linux iso

2009-12-31 11:27:33

2011-09-01 10:41:15

ubuntuISO

2020-11-25 08:57:29

Redis Docke

2021-10-20 07:18:51

Harbor鏡像項(xiàng)目
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区四区在线视频 | 成人h动漫精品一区二区器材 | 91资源在线 | 91视频在线 | 中文字幕不卡视频在线观看 | 久久av网 | 亚洲成人三区 | 日韩精品一区二区三区在线播放 | 久久久成人一区二区免费影院 | 欧美在线| 国产盗摄视频 | 日本黄色影片在线观看 | 亚洲一区二区久久久 | 成人在线国产 | 久久久久久久av | 午夜a√ | 亚洲国产精品一区二区www | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 久久免费精品 | 精品久久久网站 | 国产高清免费视频 | 精品一区av | 日本精品999| 又爽又黄axxx片免费观看 | 99国产在线 | 天天躁日日躁狠狠的躁天龙影院 | 神马福利 | 欧美lesbianxxxxhd视频社区 | 欧美精品1区2区 | 欧美日韩在线一区二区 | 日韩久久久久 | 国产精品久久久久久亚洲调教 | 老牛影视av一区二区在线观看 | 国产免费一区 | 精品国产免费一区二区三区演员表 | 久久久av中文字幕 | 中文字幕日韩一区 | 日本一二三区在线观看 | 中文字幕一区二区三区精彩视频 | 亚洲一区二区精品视频在线观看 | 日本精品视频 |