linux 光盘刻录
虽然现在DVD/CD越来越少了,基本被大容量usb移动硬盘取代了。
但是在遇到使用DVD/CD的场合,也要知道如何创建iso镜像文件,以及怎么将iso镜像文件刻录到DVD/CD。
针对DVD/CD光盘,通常有如下的操作:
利用mkisofs指令创建光盘镜像文件iso;
利用cdrecord指令将镜像文件刻录到DVD/CD光盘。
我们从centos官网下载下来的linux镜像文件,需要刻录到DVD/CD光盘中才能使用。
根据光盘是否用于开机启动,iso镜像文件也分为可开机镜像文件和不可开机镜像文件,
这两种镜像文件的制作有些差异。
mkisofs命令用于制作DVD/CD光盘镜像文件,mkisofs常用命令格式如下所示:
默认情况下,所有要被加到镜像文件中的文件都会被放置到镜像文件的根目录中, 可能会造成刻录后的文件不易分类的情况。 可以使用-graft-point选项,利用如下的方法来定义位于镜像文件中的目录, 例如:
镜像文件中的目录=实际Linux文件系统的目录
/movies/=/srv/movies/ (在Linux的/srv/movies内的文件,加至镜像文件中的/movies/目录)
/linux/etc=/etc (将Linux中的/etc/内的所有数据备份到镜像文件中的/linux/etc/目录中)
例如想要将/root, /home, /etc等目录内的数据刻录到光盘, 先制作镜像文件,先不使用-graft-point选项来处理这个镜像文件:
mkisofs无法建立ISO文件了!
可以先将/root/crontab重命名为/root/crontabbak,再执行一次mkisofs:
测试完毕后卸载光盘镜像:
此时使用-graft-point选项指定存放目录:
如果你想要将实际的数据直接倒进ISO文件中,那就得要使用这个-graft-point来处理比较妥当! 不然没有分第一层目录, 后面的数据管理实在是很麻烦。如果你是有自己要制作的数据内容,其实最简单的方法, 就是将所有的数据预先处理到某一个目录中, 再刻录该目录即可! 例如上述的/etc, /root, /home先全部复制到/srv/cdrom当中,然后跑到 /srv/cdrom 当中, 再使用如下的方式处理即可:
在的研究室中,学生常被要求要制作『一键安装』的安装光盘!也就是说,得要修改原版的光盘
镜像文件,改成可以自动加载某些程序的流程, 让这片光盘放入主机光驱后,只要开机利用光盘片
来开机,那就直接安装系统,不再需要询问管理员一些有的没有的!等于是自动化处理啦! 那些流
程比较麻烦,因为得要知道 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. 先观察一下这片光盘里面有啥东西?是否是我们需要的光盘系统!
3. 假设已经处理完毕你在 /srv/newcd 里面所要进行的各项修改行为,准备建立 ISO 文件!
新版的CentOS 7可以使用wodim命令刻录镜像文件。为了兼容旧版的cdrecord指令, 因此wodim也有连结到cdrecord就是了!
因此,还是可以使用 cdrecord指令。不过,建议还是改用wodim比较干脆!
这个指令常见的选项有下面数个:
相对图形界面模式所见即所得的!文本模式的刻录相对比较麻烦,需要先找到刻录机!
由于早期的刻录机都是使用SCSI接口,因此查询刻录机的方法就得要配合着SCSI接口的认定来处理了。
查询刻录机的方式为:
因此在这里与下面的wodim用法,只能使用另一部Demo机器测试给大家看了!
因为上面那部机器是虚拟机内的虚拟光驱 (QEMU DVD-ROM),那个无法塞入真正的光盘片啦! 所以只好找另一部实体 CentOS 7 的主机系统来测试。 因此你可以看到下面那部使用的就是正统的 ASUS 光驱了! 注意喔,一定要有 dev=/dev/xxx 那一段,不然系统会告诉你找不到光盘! 不过,反正我们知道光驱的文件名为 /dev/sr0 之类的,直接带入即可。
好了,那么现在要如何将 /tmp/system.img 刻录到 CD/DVD 里面去呢?因为要节省空间与避免浪费,
拿之前多买的可重复读写的 DVD 四倍数 DVD 片来操作! 因为是可抹除的 DVD,因此可能得要在刻录前先抹除 DVD 片里面的数据才行喔!
0. 先抹除光盘的原始内容:(非可重复读写则可略过此步骤)
1. 开始刻录:
2. 刻录完毕后,测试挂载一下,检验内容:
如果你的Linux是用来做为服务器之用的话,那么无时无刻的去想如何备份重要数据是相当重要的! 关于备份我们会在第五篇再仔细的谈一谈,这里你要会使用这些工具即可!
针对DVD/CD光盘,通常有如下的操作:
利用mkisofs指令创建光盘镜像文件iso;
利用cdrecord指令将镜像文件刻录到DVD/CD光盘。
mkisofs创建iso镜像文件
回到顶部制作一般数据光盘镜像文件
回到顶部
[root@initroot ~]# mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... \
> -graft-point isodir=systemdir ...
选项与参数:-o :后面接生成的镜像文件名。mkisofs有非常的选项可以选择,如果只是想要制作数据光盘的话,上述的选项也就够用了。 光盘的格式一般称为iso9660,这种格式一般仅支持旧版的DOS文件名, 即文件名只能以8.3(文件名8个字符,扩展名3个字符)的方式存在。 -r选项可以使文件信息能够被记录的比较完整,包括UID/GID与权限等等! 所以最好加上-r选项。
-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有转嫁或移植的意思,相关资料在下面文章内说明。
默认情况下,所有要被加到镜像文件中的文件都会被放置到镜像文件的根目录中, 可能会造成刻录后的文件不易分类的情况。 可以使用-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 .
制作可开机光盘镜像文件
回到顶部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命令刻录光盘
回到顶部这个指令常见的选项有下面数个:
[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 的格式
检测刻录机所在位置
回到顶部
[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
回到顶部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次阅读