linux 光盘刻录


虽然现在DVD/CD越来越少了,基本被大容量usb移动硬盘取代了。 但是在遇到使用DVD/CD的场合,也要知道如何创建iso镜像文件,以及怎么将iso镜像文件刻录到DVD/CD。
针对DVD/CD光盘,通常有如下的操作:
利用mkisofs指令创建光盘镜像文件iso;
利用cdrecord指令将镜像文件刻录到DVD/CD光盘。

mkisofs创建iso镜像文件

回到顶部

我们从centos官网下载下来的linux镜像文件,需要刻录到DVD/CD光盘中才能使用。 根据光盘是否用于开机启动,iso镜像文件也分为可开机镜像文件和不可开机镜像文件, 这两种镜像文件的制作有些差异。

制作一般数据光盘镜像文件

回到顶部

mkisofs命令用于制作DVD/CD光盘镜像文件,mkisofs常用命令格式如下所示:

              [root@initroot ~]# mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... \
              > -graft-point isodir=systemdir ...
              选项与参数:
              -o :后面接生成的镜像文件名。
              -J :产生较兼容于windows机器的文件名结构,可增加文件名长度到64个unicode字符
              -r :透过Rock Ridge产生支持Unix/Linux的文件数据,可记录较多的信息(如UID/GID等);
              -v :显示创建ISO文件的过程
              -V vol :建立Volume,有点像Windows在文件总管内看到的CD title;
              -m file :-m为排除(exclude)文件的意思,后面的文件不备份到镜像文件中,可使用*通配符;
              -graft-point :graft有转嫁或移植的意思,相关资料在下面文章内说明。
            
mkisofs有非常的选项可以选择,如果只是想要制作数据光盘的话,上述的选项也就够用了。 光盘的格式一般称为iso9660,这种格式一般仅支持旧版的DOS文件名, 即文件名只能以8.3(文件名8个字符,扩展名3个字符)的方式存在。 -r选项可以使文件信息能够被记录的比较完整,包括UID/GID与权限等等! 所以最好加上-r选项。
默认情况下,所有要被加到镜像文件中的文件都会被放置到镜像文件的根目录中, 可能会造成刻录后的文件不易分类的情况。 可以使用-graft-point选项,利用如下的方法来定义位于镜像文件中的目录, 例如:
镜像文件中的目录=实际Linux文件系统的目录
/movies/=/srv/movies/ (在Linux的/srv/movies内的文件,加至镜像文件中的/movies/目录)
/linux/etc=/etc (将Linux中的/etc/内的所有数据备份到镜像文件中的/linux/etc/目录中)
例如想要将/root, /home, /etc等目录内的数据刻录到光盘, 先制作镜像文件,先不使用-graft-point选项来处理这个镜像文件:
              [root@initroot ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
              I: -input-charset not specified, using utf-8 (detected in locale settings)
              genisoimage 1.1.11 (Linux)
              Scanning /root
              Scanning /root/.local
              Scanning /root/.local/share
              ...省略...
              Scanning /etc/fonts/conf.avail
              Scanning /etc/fonts/conf.d
              Scanning /etc/python3
              Using SYSTE000.;1 for /system-release-cpe (system-release)      # 被改名子了!
              Using CENTO000.;1 for /centos-release-upstream (centos-release) # 被改名子了!
              Using CRONT000.;1 for  /crontab (crontab)
              genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'. # 文件名不可一样啊!
              Unable to sort directory 
              NOTE: multiple source directories have been specified and merged into the root
              of the filesystem. Check your program arguments. genisoimage is not tar.
            
上面/etc/和/root/目录下有一个同名文件crontab,由于我们没有加-graft-point选项, 所以这两个文件都会被存放在镜像文件的根目录下,这样在镜像文件根目录下就会有两个同名文件了,这肯定是不行的。 所以上面mkisofs就是报错提示'/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.
mkisofs无法建立ISO文件了!
可以先将/root/crontab重命名为/root/crontabbak,再执行一次mkisofs:
              [root@initroot ~]# mv /root/crontab /root/crontabbak
              [root@initroot ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
              ...省略...
              Using 20_UN005.CON;1 for  /etc/fonts/conf.d/20-unhint-small-dejavu-lgc-serif.conf (20-unhint-small-dejavu-lgc-sans.conf)
              Using 66_LO008.CON;1 for  /etc/fonts/conf.d/66-lohit-bengali.conf (66-lohit-odia.conf)
              Using 89_TL002.CON;1 for  /etc/fonts/conf.d/89-tlwg-kinnari-synthetic.conf (89-tlwg-laksaman-synthetic.conf)
              Writing:   Initial Padblock                        Start Block 0
              Done with: Initial Padblock                        Block(s)    16
              Writing:   Primary Volume Descriptor               Start Block 16
              Done with: Primary Volume Descriptor               Block(s)    1
              Writing:   End Volume Descriptor                   Start Block 17
              Done with: End Volume Descriptor                   Block(s)    1
              Writing:   Version block                           Start Block 18
              Done with: Version block                           Block(s)    1
              Writing:   Path table                              Start Block 19
              Done with: Path table                              Block(s)    412
              Writing:   Directory tree                          Start Block 431
              Done with: Directory tree                          Block(s)    41189
              Writing:   Directory tree cleanup                  Start Block 41620
              Done with: Directory tree cleanup                  Block(s)    0
              Writing:   Extension record                        Start Block 41620
              Done with: Extension record                        Block(s)    1
              Writing:   The File(s)                             Start Block 41621
                4.08% done, estimate finish Mon Feb 10 20:18:50 2020
                4.54% done, estimate finish Mon Feb 10 20:20:06 2020
                4.99% done, estimate finish Mon Feb 10 20:23:28 2020
                5.45% done, estimate finish Mon Feb 10 20:27:30 2020
              ...省略...
              99.38% done, estimate finish Mon Feb 10 20:42:49 2020
              99.83% done, estimate finish Mon Feb 10 20:42:50 2020
              Total translation table size: 0
              Total rockridge attributes bytes: 19787839
              Total directory bytes: 77238272
              Path table size(bytes): 419042
              Done with: The File(s)                             Block(s)    1060094
              Writing:   Ending Padblock                         Start Block 1101715
              Done with: Ending Padblock                         Block(s)    150
              Max brk space used c3df000
              1101865 extents written (2152 MB)
            
用mount将该镜像文件挂载在/mnt目录,然后用df和ls观察该镜像文件信息:
              [root@initroot ~]# ls -lh /tmp/system.img
              -rw-r--r-- 1 root root 2.2G Feb 10 20:42 /tmp/system.img
              [root@initroot ~]# mount -o loop /tmp/system.img /mnt
              [root@initroot ~]# df -h /mnt/
              Filesystem      Size  Used Avail Use% Mounted on
              /dev/loop0      2.2G  2.2G     0 100% /mnt
              [root@initroot ~]# ls /mnt/
              2              calendar      dpkg    hddtemp.db   libao.conf      modules           pnm2ppa.conf   rsyslog.conf   thermald
              acpi           casper.conf   drirc   hdparm.conf  libaudit.conf   modules-load.d    polkit-1       rsyslog.d      thunderbird
              adduser.conf   chatscripts   emacs   host.conf    libblockdev     mono              postfix        samba          timezone
            
通过上面的观察可以看到原本在linux不同目录下的文件都被放在镜像文件的根目录下了.一堆数据都放置在一起!包括有的没有的目录与文件等等!
测试完毕后卸载光盘镜像:
              [root@initroot ~]# umount /mnt
            
上面我们发现三个目录/root, /home, /etc中的数据都被放置到了镜像文件的最顶层目录中! 这显然是不合理的。
此时使用-graft-point选项指定存放目录:
              [root@initroot ~]# mkisofs -r -V 'linux_file' -o /tmp/system.img \
              > -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
              [root@initroot ~]# ls -lh /tmp/system.img
              -rw-r--r-- 1 root root 2.2G Feb 10 21:26 /tmp/system.img
            
上面会建立一个大文件,-graft-point后面接的就是我们要备份的数据,等号左边是在镜像文件内的目录,右侧则是linux中的实际的数据。
              [root@initroot ~]# mount -o loop /tmp/system.img /mnt
              [root@initroot ~]# ls -al /mnt
              total 546
              dr-xr-xr-x    5 root root   2048 Feb 10 21:01 .
              drwxr-xr-x   23 root root   4096 Oct  8 19:23 ..
              dr-xr-xr-x  152 root root  34816 Feb  8 22:42 etc
              dr-xr-xr-x    5 root root   4096 Feb  8 21:20 home
              dr-xr-xr-x   15 root root   4096 Feb 10 20:15 root
              dr-xr-xr-x 3890 root root 514048 Feb 10 21:01 rr_moved
              [root@initroot ~]# umount /mnt
            
上面可以看出数据分门别类存放在各个目录中了。
如果你想要将实际的数据直接倒进ISO文件中,那就得要使用这个-graft-point来处理比较妥当! 不然没有分第一层目录, 后面的数据管理实在是很麻烦。如果你是有自己要制作的数据内容,其实最简单的方法, 就是将所有的数据预先处理到某一个目录中, 再刻录该目录即可! 例如上述的/etc, /root, /home先全部复制到/srv/cdrom当中,然后跑到 /srv/cdrom 当中, 再使用如下的方式处理即可:
              mkisofs -r -v -o /tmp/system.img . 
              

制作可开机光盘镜像文件

回到顶部

在的研究室中,学生常被要求要制作『一键安装』的安装光盘!也就是说,得要修改原版的光盘 镜像文件,改成可以自动加载某些程序的流程, 让这片光盘放入主机光驱后,只要开机利用光盘片 来开机,那就直接安装系统,不再需要询问管理员一些有的没有的!等于是自动化处理啦! 那些流 程比较麻烦,因为得要知道 kickstart 的相关技术等,那个我们先不谈, 这里要谈的是,那如何让这片光盘的内容被修改之后, 还可以刻录成为可开机的模样呢?因为这部测试机的容量比较小,又仅是测试而已啊,因此选择 CentOS-7-x86_64-Minimal-1503-01.iso 这个最小安装光盘镜像文件来测试给各位瞧瞧! 假设你已经 到昆山科大 http://ftp.ksu.edu.tw/FTP/CentOS/7/isos/x86_64/ 取得了最小安装的 Image 文件,而且放在 /home 下面~之后我们要将里头的数据进行修改,假设新的镜像文件目录放置于 /srv/newcd 里面,那你应该要这样做:
1. 先观察一下这片光盘里面有啥东西?是否是我们需要的光盘系统!

              [root@initroot ~]# isoinfo -d -i /home/CentOS-7-x86_64-Minimal-1503-01.iso
              CD-ROM is in ISO 9660 format
              System id: LINUX
              Volume id: CentOS 7 x86_64
              Volume set id:
              Publisher id:
              Data preparer id:
              Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) ...
              Copyright File id:
              .....(中间省略).....
              Eltorito defaultboot header:
              Bootid 88 (bootable)
              Boot media 0 (No Emulation Boot)
              Load segment 0
              Sys type 0
              Nsect 4
            
2. 开始挂载这片光盘到/mnt,并且将所有数据完整复制到/srv/newcd目录:
              [root@initroot ~]# mount /home/CentOS-7-x86_64-Minimal-1503-01.iso /mnt
              [root@initroot ~]# mkdir /srv/newcd
              [root@initroot ~]# rsync -a /mnt/ /srv/newcd
              [root@initroot ~]# ll /srv/newcd/
              -rw-r--r--. 1 root root 16 Apr 1 07:11 CentOS_BuildTag
              drwxr-xr-x. 3 root root 33 Mar 28 06:34 EFI
              -rw-r--r--. 1 root root 215 Mar 28 06:36 EULA
              -rw-r--r--. 1 root root 18009 Mar 28 06:36 GPL
              drwxr-xr-x. 3 root root 54 Mar 28 06:34 images
              drwxr-xr-x. 2 root root 4096 Mar 28 06:34 isolinux
              drwxr-xr-x. 2 root root 41 Mar 28 06:34 LiveOS
              drwxr-xr-x. 2 root root 20480 Apr 1 07:11 Packages
              drwxr-xr-x. 2 root root 4096 Apr 1 07:11 repodata
              -rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-7
              -rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-Testing-7
              -r--r--r--. 1 root root 2883 Apr 1 07:15 TRANS.TBL
            
# rsync 可以完整的复制所有的权限属性等数据,也能够进行镜像处理!相当好用的指令喔! # 这里先了解一下即可。现在newcd/目录内已经是完整的镜像文件内容!
3. 假设已经处理完毕你在 /srv/newcd 里面所要进行的各项修改行为,准备建立 ISO 文件!
              [root@initroot ~]# ll /srv/newcd/isolinux/
              -r--r--r--. 1 root root 2048 Apr 1 07:15 boot.cat        # 开机的型号数据等等
              -rw-r--r--. 1 root root 84 Mar 28 06:34 boot.msg
              -rw-r--r--. 1 root root 281 Mar 28 06:34 grub.conf  
              -rw-r--r--. 1 root root 35745476 Mar 28 06:31 initrd.img
              -rw-r--r--. 1 root root 24576 Mar 28 06:38 isolinux.bin   # 相当于开机管理程序
              -rw-r--r--. 1 root root 3032 Mar 28 06:34 isolinux.cfg
              -rw-r--r--. 1 root root 176500 Sep 11 2014 memtest
              -rw-r--r--. 1 root root 186 Jul 2 2014 splash.png
              -r--r--r--. 1 root root 2438 Apr 1 07:15 TRANS.TBL
              -rw-r--r--. 1 root root 33997348 Mar 28 06:33 upgrade.img
              -rw-r--r--. 1 root root 153104 Mar 6 13:46 vesamenu.c32
              -rwxr-xr-x. 1 root root 5029136 Mar 6 19:45 vmlinuz  # Linux 核心文件

              [root@initroot ~]# cd /srv/newcd
              [root@initroot newcd]# mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \
              > -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .
            
此时你就有一个/custom.img文件存在,可以将该光盘刻录出来啰!就这么简单!

wodim/cdrecord命令刻录光盘

回到顶部

新版的CentOS 7可以使用wodim命令刻录镜像文件。为了兼容旧版的cdrecord指令, 因此wodim也有连结到cdrecord就是了! 因此,还是可以使用 cdrecord指令。不过,建议还是改用wodim比较干脆!
这个指令常见的选项有下面数个:

              [root@initroot ~]# wodim --devices dev=/dev/sr0...         #查询刻录机的 BUS 位置
              [root@initroot ~]# wodim -v dev=/dev/sr0 blank=[fast|all] #抹除重复读写片
              [root@initroot ~]# wodim -v dev=/dev/sr0 -format #格式化 DVD+RW
              [root@initroot ~]# wodim -v dev=/dev/sr0 [可用选项功能] file.iso
            
选项与参数:
--devices :用在扫瞄磁盘总线并找出可用的刻录机,后续的装置为 ATA 接口
-v :在 cdrecord 运作的过程中,显示过程而已。
dev=/dev/sr0 :可以找出此光驱的 bus 地址,非常重要!
blank=[fast|all]:blank 为抹除可重复写入的 CD/DVD-RW,使用 fast 较快,all 较完整
-format :对光盘片进行格式化,但是仅针对 DVD+RW 这种格式的 DVD 而已;
[可用选项功能] 主要是写入 CD/DVD 时可使用的选项,常见的选项包括有: -data :指定后面的文件以数据格式写入,不是以 CD 音轨(-audio)方式写入!
speed=X :指定刻录速度,例如 CD 可用 speed=40 为 40 倍数,DVD 则可用 speed=4 之类
-eject :指定刻录完毕后自动退出光盘
fs=Ym :指定多少缓冲存储器,可用在将镜像文件先暂存至缓冲存储器。预设为 4m, 一般建议可增加到 8m ,不过,还是得视你的刻录机而定。 针对 DVD 的选项功能: driveropts=burnfree :打开 Buffer Underrun Free 模式的写入功能 -sao :支持 DVD-RW 的格式

检测刻录机所在位置

回到顶部

相对图形界面模式所见即所得的!文本模式的刻录相对比较麻烦,需要先找到刻录机! 由于早期的刻录机都是使用SCSI接口,因此查询刻录机的方法就得要配合着SCSI接口的认定来处理了。 查询刻录机的方式为:

              [root@initroot ~]# ll /dev/sr0
              brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光驱文件名!
              [root@initroot ~]# wodim --devices dev=/dev/sr0
              -------------------------------------------------------------------------
              0
              dev='/dev/sr0'
              rwrw-- : 'QEMU' 'QEMU DVD-ROM'
              -------------------------------------------------------------------------
              [root@demo ~]# wodim --devices dev=/dev/sr0
              wodim: Overview of accessible drives (1 found) :
              -------------------------------------------------------------------------
              0
              dev='/dev/sr0'
              rwrw-- : 'ASUS' 'DRW-24D1ST'
              -------------------------------------------------------------------------
            
可以发现到其实做了两个测试!上面的那部主机系统是虚拟机,当然光驱也是仿真的,没法用。
因此在这里与下面的wodim用法,只能使用另一部Demo机器测试给大家看了!
因为上面那部机器是虚拟机内的虚拟光驱 (QEMU DVD-ROM),那个无法塞入真正的光盘片啦! 所以只好找另一部实体 CentOS 7 的主机系统来测试。 因此你可以看到下面那部使用的就是正统的 ASUS 光驱了! 注意喔,一定要有 dev=/dev/xxx 那一段,不然系统会告诉你找不到光盘! 不过,反正我们知道光驱的文件名为 /dev/sr0 之类的,直接带入即可。

刻录CD/DVD

回到顶部

好了,那么现在要如何将 /tmp/system.img 刻录到 CD/DVD 里面去呢?因为要节省空间与避免浪费, 拿之前多买的可重复读写的 DVD 四倍数 DVD 片来操作! 因为是可抹除的 DVD,因此可能得要在刻录前先抹除 DVD 片里面的数据才行喔!
0. 先抹除光盘的原始内容:(非可重复读写则可略过此步骤)

              [root@demo ~]# wodim -v dev=/dev/sr0 blank=fast
            
# 中间会跑出一堆讯息告诉你抹除的进度,而且会有 10 秒钟的时间等待你的取消!
1. 开始刻录:
              [root@demo ~]# wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img
              ....(前面省略)....
              Waiting for reader process to fill input buffer ... input buffer ready.
              Starting new track at sector: 0
              Track 01:
              86 of
              86 MB written (fifo 100%) [buf
              97%]
              4.0x.
              # 这里有流程时间!
              Track 01: Total bytes read/written: 90937344/90937344 (44403 sectors).
              Writing
              time:
              # 写入的总时间
              38.337s
              Average write speed
              # 换算下来的写入时间
              1.7x.
              Min drive buffer fill was 97%
              Fixating...
              Fixating time:
              120.943s
              wodim: fifo had 1433 puts and 1433 gets.
              wodim: fifo was 0 times empty and 777 times full, min fill was 89%.
            
# 因为有加上 -eject 这个选项的缘故,因此刻录完成后,DVD 会被退出光驱喔!记得推回去!
2. 刻录完毕后,测试挂载一下,检验内容:
              [root@demo ~]# mount /dev/sr0/mnt
              [root@demo ~]# df -h /mnt
              Filesystem
              Filesystem
              /dev/sr0
              Size
              Size
              Used Avail Use% Mounted on
              Used Avail Use% Mounted on
              87M
              87M
              0 100% /mnt
              [root@demo ~]# ll /mnt
              dr-xr-xr-x. 135 root root 36864 Jun 30 04:00 etc
              dr-xr-xr-x.
              19 root root
              [root@demo ~]# umount /mnt
              8192 Jul
              2 13:16 root
            
基本上,光盘刻录的指令越来越简单,虽然有很多的参数可以使用,不过上面的语法就很足够了! 一般来说,如果有刻录的需求,大多还是使用图形界面的软件来处理比较方便 使用文字界面的刻录,真的大部分都是刻录数据光盘较多。因此,上面的语法已经足够工程师的使用了!
如果你的Linux是用来做为服务器之用的话,那么无时无刻的去想如何备份重要数据是相当重要的! 关于备份我们会在第五篇再仔细的谈一谈,这里你要会使用这些工具即可!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读