工作要刻录光盘,之前装Linux服务器尝试刻录了几次,平时刻录光盘都是在Windows虚拟机上刻录,所以花了几个小时研究Linux上如何刻录DVD-R的光盘。我家里的个人数据也打算买档案级光盘加密刻录,冷备份收藏起来。
安装
安装 dvd+rw-tools。
1 2 3 4 5 6 7 8 9
| sudo dnf install dvd+rw-tools
sudo rpm-ostree install dvd+rw-tools
sudo apt install dvd+rw-tools
|
读取光盘信息
使用 dvd+rw-mediainfo /dev/sr0 读取光盘状态信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| INQUIRY: [ACER ][DVD-RW AXD001 ][LD11] GET [CURRENT] CONFIGURATION: Mounted Media: 1Bh, DVD+R Media ID: CMC MAG/M01 Current Write Speed: 8.0x1385=11080KB/s Write Speed #0: 8.0x1385=11080KB/s Write Speed #1: 6.0x1385=8310KB/s Write Speed #2: 4.0x1385=5540KB/s Write Speed #3: 3.0x1385=4155KB/s Speed Descriptor#0: 00/2295103 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s Speed Descriptor#1: 00/2295103 R@8.0x1385=11080KB/s W@6.0x1385=8310KB/s Speed Descriptor#2: 00/2295103 R@8.0x1385=11080KB/s W@4.0x1385=5540KB/s Speed Descriptor#3: 00/2295103 R@8.0x1385=11080KB/s W@3.0x1385=4155KB/s READ DVD STRUCTURE[#0h]: Media Book Type: 00h, DVD-ROM book [revision 0] Legacy lead-out at: 2295104*2KB=4700372992 READ DISC INFORMATION: Disc status: blank Number of Sessions: 1 State of Last Session: empty "Next" Track: 1 Number of Tracks: 1 READ TRACK INFORMATION[#1]: Track State: blank Track Start Address: 0*2KB Next Writable Address: 0*2KB Free Blocks: 2295104*2KB Track Size: 2295104*2KB ROM Compatibility LBA: 270336 READ CAPACITY: 0*2048=0
|
参数【INQUIRY】表示我使用的光驱型号,我用的是Acer DVD-RW AXD001,公司买的,用起来挺顺手,支持USB2.0和Type-C接口。
不同的光盘生产厂商,【Media ID】彼此不同,比如上文用的 aigo 光盘是CMC MAG/M01,ARITA 光盘是 RITEK/F16。都是普通的 4.7G DVD 光盘(一桶50片,五十块左右)。注意,不是档案级光盘不适合冷备份那些需要存储长达二十年的数据。档案级光盘通常比这种普通光盘贵两倍多的价格(一桶50片,两百多块钱),这种存储介质价格高昂。如果见到那些宣称档案级光盘却非常便宜(一桶50片不到一百块),通常不是真的档案级光盘。
注意看【Number of Sessions】、【”Next” Track】、【Number of Tracks】,空光盘的数值是1。每次向光盘附加刻录文件,这三个数值会被加一,比如下文初始化光盘并刻录一个文本文件。
初始化光盘并刻录文件
1 2
| growisofs -Z /dev/sr0 -R -J /path/to/file.txt
|
首次刻录使用 -Z,表示初始化光盘并开始第一个会话;-R表示启用 Rock Ridge 扩展,保留 Unix 权限、长文件名等;-J表示启用 Joliet 扩展,提高 Windows 兼容性;可选的-V <LABEL_NAME> 可以设定光盘的名称
刻录显示信息如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Executing 'mkisofs -R -J /path/to/file.txt | builtin_dd of=/dev/sr0 obs=32k seek=0' I: -input-charset not specified, using utf-8 (detected in locale settings) Total translation table size: 0 Total rockridge attributes bytes: 247 Total directory bytes: 0 Path table size(bytes): 10 Max brk space used 0 182 extents written (0 MB) /dev/sr0: "Current Write Speed" is 3.1x1352KBps. builtin_dd: 192*2KB out @ average 0.0x1352KBps /dev/sr0: flushing cache /dev/sr0: closing track /dev/sr0: closing session /dev/sr0: reloading tray
|
实际上 growisofs 这个命令底层调用的是 mkisofs 命令,直接把文件打包成镜像刻录到了光盘,省去用户先打包镜像再刻录。
第一次刻录文件后,光盘信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| INQUIRY: [ACER ][DVD-RW AXD001 ][LD11] GET [CURRENT] CONFIGURATION: Mounted Media: 1Bh, DVD+R Media ID: CMC MAG/M01 Current Write Speed: 8.0x1385=11080KB/s Write Speed #0: 8.0x1385=11080KB/s Write Speed #1: 6.0x1385=8310KB/s Write Speed #2: 4.0x1385=5540KB/s Write Speed #3: 3.0x1385=4155KB/s Speed Descriptor#0: 00/191 R@4.0x1385=5540KB/s W@8.0x1385=11080KB/s Speed Descriptor#1: 00/191 R@4.0x1385=5540KB/s W@6.0x1385=8310KB/s Speed Descriptor#2: 00/191 R@4.0x1385=5540KB/s W@4.0x1385=5540KB/s Speed Descriptor#3: 00/191 R@4.0x1385=5540KB/s W@3.0x1385=4155KB/s READ DVD STRUCTURE[#0h]: Media Book Type: 00h, DVD-ROM book [revision 0] Legacy lead-out at: 2295104*2KB=4700372992 READ DISC INFORMATION: Disc status: appendable Number of Sessions: 2 State of Last Session: empty "Next" Track: 2 Number of Tracks: 2 READ TRACK INFORMATION[#1]: Track State: invisible Track Start Address: 0*2KB Free Blocks: 0*2KB Track Size: 192*2KB ROM Compatibility LBA: 270336 READ TRACK INFORMATION[#2]: Track State: blank Track Start Address: 2240*2KB Next Writable Address: 2240*2KB Free Blocks: 2292864*2KB Track Size: 2292864*2KB ROM Compatibility LBA: 270336 FABRICATED TOC: Track#1 : 17@0 Track#AA : 17@192 Multi-session Info: #1@0 READ CAPACITY: 192*2048=393216
|
刻录完成后光盘将被自动弹出,再次插入读取光盘信息,可以看到,第一个Track READ TRACK INFORMATION[#1]现在被写入了数据,大小是 192*2KB。刻录的文件会存储在光盘的根目录。
挂载光盘到指定目录
通常Linux桌面操作系统会自动挂载到用户特定的目录,手动挂载和卸载方式如下:
1 2 3 4 5 6
| sudo mount /dev/sr0 /mnt/
sudo umount /mnt/
|
附加刻录
第二次及之后的刻录使用 -M,表示在已有会话基础上继续写入。
1 2
| growisofs -M /dev/sr0 -R -J /path/to/file2.txt
|
【提示】
重要规则:追加刻录时,-R、-J 等文件系统选项应与首次刻录保持一致。
如果你刻录一个文件夹,文件夹结构如下:
1 2 3 4 5
| somedir/ ├── rootfile.txt └── subdir/ └── subfile.txt
|
执行下面的命令刻录文件夹到光盘:
1 2
| growisofs -M /dev/sr0 -R -J /path/to/somedir/
|
再次插入光盘,你会发现,somedir/消失了!取而代之的是文件夹中的内容,光盘中的文件夹结构如下:
1 2 3 4 5
| ./ ├── rootfile.txt └── subdir/ └── subfile.txt
|
也就是说,刻录的过程中会将文件夹内部内容直接刻录到光盘的根目录,这一点请务必注意!
覆盖测试
如果刻录一个同名文件呢?比如前文刻录过 somedir/rootfile.txt 和 somedir/subdir/subfile.txt 都是在光盘的根目录,我们现在修改文件内容后再刻录上面的两个同结构、同名,但是不同内容的文件,看看会发生什么。
1 2
| growisofs -M /dev/sr0 -R -J /path/to/somedir/
|
刻录过程输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Executing 'mkisofs -C 24416,36880 -M /dev/fd/3 -R -J /path/to/somedir/ | builtin_dd of=/dev/sr0 obs=32k seek=2305' I: -input-charset not specified, using utf-8 (detected in locale settings) Rock Ridge signatures found Total translation table size: 0 Total rockridge attributes bytes: 1169 Total directory bytes: 4096 Path table size(bytes): 42 Max brk space used 0 37067 extents written (72 MB) /dev/sr0: "Current Write Speed" is 8.2x1352KBps. builtin_dd: 192*2KB out @ average 0.0x1352KBps /dev/sr0: flushing cache /dev/sr0: closing track /dev/sr0: closing session /dev/sr0: reloading tray
|
刻录成功了!读取这两个文件内容可以发现,原本的内容被覆盖成刚刻录的同名文件的内容!
嘿嘿,或许我们可以利用这个特性,刻录一个空的文件夹来清空只读光盘!
1 2
| growisofs -M /dev/sr0 -R -J /path/to/emptydir/
|
刻录成功,但是插入光盘读取内容后发现,这根本没变化嘛!!!!
查了一下资料,说是额外添加一个选项,将光盘的根目录映射到我们的空文件夹,如下所示:
1 2
| growisofs -M /dev/sr0 -R -J -graft-points /=/path/to/emptydir/
|
选项 -graft-points 的作用就是将 = 右侧的本地目录名称映射到光盘对应的目录。在这里,我们将一个空的文件夹映射到了光盘的根目录。
试了一下,还是不行。看样子只能覆盖文件,无法覆盖目录了。相比Windows上的UDF文件系统,Linux在光盘文件系统的读写支持相对而言不够全面。
查了一下 archwiki
ISO-9960 多会话意味着一个介质使用只读文件系统的同时,依然可以在第一个未被使用的块地址写,并且在这个块上会有新的 ISO 树。这个新树协同于新加的或覆写的文件的数据块。数据的块在旧的 ISO 树中的,无法再被写。
Linux 和其他操作系统将挂载在介质上的最新的会话上的文件夹树。最新的树也将正常的显示旧会话的文件。
大意是:旧会话的文件与新会话的文件都会被操作系统读取并显示。也就是说文件可以被覆盖,文件夹不行?
再做个测试,我们之前测的覆盖根目录,既然光盘的根目录无法覆盖,我们来覆盖子目录试试?
1 2 3 4 5 6
| erase_test/ ├── rootfile.txt └── subdir/ ├── subfile.txt └── sub-subdir/
|
将上述结构刻录光盘:
1 2
| growisofs -M /dev/sr0 -R -J /path/to/erase_test/
|
读取光盘,目录树是这样的:
1 2 3 4 5
| ./ ├── rootfile.txt └── subdir/ ├── subfile.txt └── sub-subdir/
|
然后我们把 erase_test/subdir/ 中的所有文件和目录删掉,再刻录光盘。读取光盘,目录树是这样的:
1 2 3 4 5
| ./ ├── rootfile.txt └── subdir/ ├── subfile.txt └── sub-subdir/
|
好吧,看样子所有的目录都无法被覆盖,只能覆盖文件内容。
封盘
封盘(Finalize)是在光盘末尾写入 Lead-out 区域,并更新光盘的 Disc Control Block(DCB),将光盘状态从 appendable(可追加)改为 unappendable(不可追加)。
封盘后,光盘变成纯只读介质,永久禁止再次刻录,防止数据篡改。
【注意】
注意:封盘是不可逆操作,一旦封盘,任何数据都无法再写入、修改或删除。
执行下列命令进行封盘处理:
1 2
| growisofs -M /dev/sr0=/dev/zero
|
将 /dev/zero 作为输入源,growisofs -M 会将零数据写入光盘的剩余可用空间,直到光盘写满或到达物理边界。写满后,光驱固件会自动关闭光盘,完成封盘。
如果全新光盘只烧录一个文件就封盘,可以试试在命令中添加 -dvd-compat 选项。
封盘后的光盘状态如下,注意看【Disc status】:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| INQUIRY: [ACER ][DVD-RW AXD001 ][LD11] GET [CURRENT] CONFIGURATION: Mounted Media: 1Bh, DVD+R Media ID: CMC MAG/M01 Current Write Speed: 8.0x1385=11080KB/s Write Speed #0: 8.0x1385=11080KB/s Write Speed #1: 6.0x1385=8310KB/s Write Speed #2: 4.0x1385=5540KB/s Write Speed #3: 3.0x1385=4155KB/s Speed Descriptor#0: 00/2295103 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s Speed Descriptor#1: 00/2295103 R@8.0x1385=11080KB/s W@6.0x1385=8310KB/s Speed Descriptor#2: 00/2295103 R@8.0x1385=11080KB/s W@4.0x1385=5540KB/s Speed Descriptor#3: 00/2295103 R@8.0x1385=11080KB/s W@3.0x1385=4155KB/s READ DVD STRUCTURE[#0h]: Media Book Type: 00h, DVD-ROM book [revision 0] Legacy lead-out at: 2295104*2KB=4700372992 READ DISC INFORMATION: Disc status: complete Number of Sessions: 25 State of Last Session: complete Number of Tracks: 25 READ TRACK INFORMATION[#1]: Track State: invisible Track Start Address: 0*2KB Free Blocks: 0*2KB Track Size: 192*2KB ROM Compatibility LBA: 270336 ...
|
总结
利用 dvd+rw-tools 创建的 ISO-9960 光盘文件系统支持多会话刻录和覆盖同名文件,但不支持覆盖目录,无法删除已有文件。
如果将光盘用于冷备份,购买档案级只读光盘,不要用普通光盘。备份前将数据加密并用sha1sum 计算哈希值保存成文件。刻录完成后用 sha1sum -c *.sha1 校验所有光盘中的文件是否通过。
CD光盘容量太小;BD光盘容量大,BD刻录机却更贵。所以相比 CD 和 BD 光盘,档案级 DVD 容量合理价格相对便宜,适合存储文档、图片、录音这些小文件。
相关参考链接