本着让Linux精神发扬光大宗旨,我将部门原来的Windows2000服务器上所有的数据与提供的服务全部迁移到新建的Linux服务器上。在我即将要把这台老Windows2000服务器扔到一个阴暗的小角落的时候,眼前一亮,忽然发现这台破机器上还有一个Sony光盘刻录机。我一向有取它人所弃,变废为宝的习惯,所以自然不能放过这个好东东。
如何在Linux下使用刻录机呢?我搜遍网上资料库,也没有能找到一个比较有效及全面的教材。无奈之下,只能闭关一个人瞎琢磨一番,当我抽完第7根香烟的时候,一个为success的字符串终于出现屏幕上。我惊喜不已,大声尖叫一下,吓得身边正在美食的老兄,手指一抖,一块好大的肥肉落在地上。此兄心痛不已,对我龇牙咧嘴下止,并向上天发誓:三日内必取我的项上人头,决不失言,否则……。此及后话,我就不再多言,进入我们的主题吧。
硬件环境: cpu: Inter Pentium2 400
mem: 384MB
cdrom: ASUS
cdr: SONY
软件环境: os: Redhat 7.0
kernel: 2.2.16
在Linux下实现光盘刻录的软件最著名的工具是cdrecord。实际上它是一个工具包,其中包括cdreocrd, mkisofs, cdda2wav。dda2wav是针对于刻录Audio CD的,不在这篇文章的说明范围之内。我们重点是说明cdrecord,mkisofs的用法,以用如何配置SCSI与IDE设备。许多图形界面的光盘刻录软件其实在底层调用的就是cdrecord,这些软件我们可以在www.linuxbyte.net中找到,并且下载使用它们。在Linux系统中,cdrecord是与SCSI通用设备一起工作的,我想大部份读者用的都是IDE光盘刻录机,所以配置的关键就是将IDE设备摸拟成SCSI设备。要想将IDE设备摸拟成SCSI设备,系统内核就必须支持ATAPI-SCSI emulation或SCSI host adapter emulation,如果你的系统内核现在还不是这样配置的,那么你就需要重新编译内核并且升级它。幸好,我手中上使用的这个Linux版本就已经默认支持了。
第一步,我们应该知道我们的光驱与刻录机对应是IDE哪一个通道,在Linux下是使用哪一个设备名。因为我们要在系统引导时让系统内核知道哪些设备需要模拟成SCSI设备,我们就得传递一些参数给系统内核,具体做法如下:
编辑lilo.conf文件,给Linux引导模块增加一行参数。
append = "hdb=ide-scsi hdd=ide-scsi"
执行lilo命令,进行回写操作。
hdx是指光驱或刻录机在Linux下对应的IDE设备名。如果你打算进行光盘数据直接刻录时就需要如上的两个字段,因为cdrecord在读写数据时要求两个设备都为SCSI接口的。但是如果你只是通过先生成ISO中间文件,然后再刻录这种形式的话,就只要指定其中一个字段就行了。如下:
append = "hdd=ide-scsi"
第二步,当重新引导系统完毕后,我们现在需要做得是将sg与ide-scsi这两个内核驱动模块加载到系统内核里去,并为它们设定SCSI设备名。sg是指SCSI设备驱动模块,ide-scsi是指IDE设备摸拟SCSI设备驱动模块。操作如下:
modprobe sg
modprobe ide-scsi
执行这两个操作后,我们执行lsmod命令,查询系统内核已加载模块信息,对我们操作的结果进行验证,显示信息如下:
Module Size Used by
ide-scsi 7336 0 (autoclean)
sg 15704 0 (unused)
vfat 9404 0 (autoclean) (unused)
fat 30688 0 (autoclean) [vfat]
soundcore 2596 0 (autoclean) (unused)
autofs 9124 1 (autoclean)
lockd 31176 1 (autoclean)
sunrpc 52964 1 (autoclean) [lockd]
3c59x 19844 1 (autoclean)
agpgart 18600 0 (unused)
usb-uhci 19052 0 (unused)
usbcore 42088 1 [usb-uhci]
执行上面的操作后,我们就可以察看内核数据映像文件,得到设备更详细的资料,最重要的是IDE模拟设备对应SCSI设备的id号。
cat /proc/scsi/scsi
-------------------------------------------------------------------
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ASUS Model: CD-S400/A Rev: 2.0S
Type: CD-ROM ANSI SCSI revision: 02
Host: scsi0 Channel: 00 Id: 01 Lun: 00
Vendor: SONY Model: CD-RW CRX100E Rev: 1.0m
Type: CD-ROM ANSI SCSI revision: 02
当然,你的显示内容可能有所不同,但形式应是一样的。
系统即然已经认出来了我们模拟的SCSI设备,但是我们还是要提供SCSI设备名映射它们,以便能让刻录软件能够使用。现好内核系统在加载sg时,就自动将/dev/sg0,/dev/sg1与我们的设备建立的对应关系。
现在你可以使用scsi_info这个命令察看得到SCSI设备信息。
scsi_info /dev/sg0
---------------------------------------------------------------
SCSI_ID="0,0,0"
MODEL="ASUS CD-S400/A"
FW_REV="2.0S"
scsi_info /dev/hdd
---------------------------------------------------------------
SCSI_ID="0,1,0"
MODEL="SONY CD-RW CRX100E"
FW_REV="1.0m"
这时我们已经正确地加载了这些设备。
第三步,如果你是使用图形界面的操作软件,以下的内容你就不必再继续往下看了,你只要按照软件的提示,填入一些相应的参数,就可以执行操作了。我们在这里重点讲得是如何在命令行模式下进行操作。不管是你是想选择文件进行刻录,还是直接进行光盘数据刻录,我们都需要生成一个中间ISO文件。生成ISO文件的任务就接给mkisofs这个命令来完成了,请输入如下命令:
mkisofs -r -o temp/aaa.iso data/
具体参数解释如下:
-r 支持长文件名
-o 指定输出目标文件
目标目录最后在新生成光盘中做为根目录存在,里面存放的是你需要刻录的数据。这个目标目录最好是新建的,千万不用选择/tmp或用户主目录,因为这些目录内会有一些临时文件或隐含文件存在。我刚开始不知道,最后才发现新刻录的光盘里根目录下有一些莫名其妙的文件。如果你是从光盘直接生成ISO文件,就需要用到dd这个命令了。请键入如下命令:
dd if=/dev/cdrom of=temp/aaa.iso
具体参数解释如下:
if 接定数据源设备
of 接定目录文件
生成的ISO文件,随时通过以下的命令进行验证,查看结果是否是我们所想要的。
mount aaa.iso -r -o loop /mnt/test
可写光盘的容量都是有限的,所以我们必须提前知道我们生成ISO文件的大小,否则会在刻盘时发生错误,到时候后悔也来不及了。直接察看ISO文件大小是可以的,但是我们要生成以后才知道,在这里我来告诉大家一个小技巧,如何察看一个目录,以及这个目录下所有的子目录中的文件大小的总和:
du -m
最后一行数据就行了,数据单位是MB。
第四步,就也是最后一步了,我们只需要用cdrecord命令进行光盘刻录就行了。请键入如下命令:
cdrecord -v speed =2 dev=0.1.0 test/aaa.iso
具体参数解释如下:
-v 进行数据校验
speed 指定刻录机写盘的速度
dev 指定刻录机的SCSI设备的ID号。
-dummy 虚拟操作。