bmaptool copy

这个章节描述了bmaptool的"copy"子命令,它的结构如下:

  1. 用法 - 讨论了"copy"子命令的一般用法。
  2. 优化 - 描述了"copy"子命令实现的优化。
  3. Tizen IVI例子 - 在Tizen IVI中给出了一个"bmaptool copy"用法的例子。

用法

"bmaptool copy"命令使用bmap,将一个文件或图像复制到一个不同的文件或块设备中。 我们来关注图像拍摄的使用场景。 其他的场景类似。

下面的命令将"image.raw"原始图像移动到"/dev/sdg"块设备中(如USB盘),使用块图文件"image.bmap"。

 $ bmaptool copy --bmap image.bmap image.raw /dev/sdg

通常,原始图像以压缩的方式存在(例如"bzip2"),在压缩文件里,你可以使用同样的命令来移动图片。

 $ bmaptool copy --bmap image.bmap image.bz2 /dev/sdg

其中,"image.bz2"是压缩的原始图像。

如果bmap文件作为图像存放在相同的目录下,则bmaptool工具会自动发现它,不需要使用"--bmap"选项。

 $ bmaptool copy image.bz2 /dev/sdg

如果图像保存在远程 FTP/HTTP/HTTPS/SSH服务器,你不需要将它下载下来,bmaptool工具接受本地路径和URL。

 $ bmaptool copy http://my.server/blah/image.bz2 /dev/sdg

当然,上面的命令认为在相同地方保存的图像的bmap文件为"image.bz2"。

从根本来讲,bemaptool工作如下:

  1. 如果不使用--bmap选项,在同一个地方搜索bmap文件作为图像文件。
  2. 读取和解析bmap文件
  3. 如果在bmap文件中出现OpenPGP标志,或出现分离的OpenPGP标志,进行验证。
  4. 验证bmap文件的SHA256校验和。
  5. 一块块地读取图像("image.bz2"),及时解压这些图像块。
  6. 验证所有映射块的SHA256校验和。
  7. 将数据写到目标文件(/dev/sdg)。

注:bmaptool工具不会将整个图像解压缩成一个临时文件, 它将使用流解压。

支持的压缩格式

目前,文件扩展名的压缩类型和下面的压缩类型支持:".bz2",".gz",".gzip",".xz",".tar.gz"或".tgz",".tar.bz2"和".tar.xz"。 如果图像文件没有这些扩展名,则认为它没有被压缩。

排他的块设备访问

"/dev/sdg"块设备以排他的模式开放,这意味着,如果你指定的块设备正在挂载或其他使用,bmaptool将会拒绝你使用。 换句话说,bmaptool仅接受那些没有开放给其他设备的块设备(参考"open()"系统调用"O_EXCL"标志)。 例如,bmaptool将拒绝根分区。 这是一个安全的措施,以防bmaptool用户错误地修改他们的数据。

代理设置

像大部分标准的Linux软件,bmaptool使用"http_proxy"/"https_proxy"/"ftp_proxy"/"no_proxy"环境变量作为它的代理设置。

不带bmap的复制

如果没有使用"--bmap"选项,且bmaptool没有成功地自动发现bmap文件,则有错误。 如果你要不带bmap文件复制,请使用"--nobmap"选项。 当然,这会比使用bmap文件复制慢。

SHA-256验证

对于bmap文件和图像文件中的所有映射区域,bmap文件自己携带SHA256校验和。 Bmaptool工具总是在复制图像的时候,因为校验不匹配而存在错误信息的时候,验证校验和。 这就保证了数据的完整性。 可以使用"--no-verify"选项使校验失效。

OpenPGP标志验证

bmap文件可以签名为OpenPGPOpenPGP(即gpg),这样,在复制数据的时候,bmaptool将会校验这些标志。 如果签名损坏,bmaptool显示错误信息。 可以使用"--no-sig-verify"选项使签名验证失效。

OpenPGP签名保证了bmap文件的完整性和创作性。 因为bmap文件包含了映射图像区域的SHA256校验和,签名页保证了映射图像区域的完整性和创作性。 拍摄图片的时候,丢弃未映射的图像区域,所以无所谓他们的内容,但在一个完整的图像中,未映射的区域都是0字节。 然而,当前的bmaptool工具不会验证未映射区域,因为未映射区域不会增加任何内容。

Bmaptool工具支持分离的OpenPGP签名,和"in-band" "clearsign"签名一样(参考"--clearsign" gpg选项)。 "clearsign"的意思是,签名在bmap文件中以"clearsign"格式保存。

如果存在的话,Bmaptool将自动检测bmap文件中的clearsign签名并验证。 如果没有clearsign签名,bmaptool工具试图在一个文件中用与bmap文件名相同的基本名查找分离签名,带".sig"或".asc"扩展名。 在与bmap文件的相同路径下(本地路径或URL)查找分离签名。

优化

Bmaptool工具移动图片比"dd"等工具快很多,主要是因为bmap包含映射块的列表。 然而,还有其他优化能够加快移动到块设备中。

主要的优化是,bmaptool切换目标块设备的I/O调度到"noop",因为在顺序书写时,noop调度最快,直接到达块设备。 当"bmaptool copy"完成时,回复原始的I/O调度。

bmaptool的其他优化,有两个独立的线程分别用于读和写:

  • 第一个线程大概读取图像的压缩块,然后解压缩,并验证SHA256校验和。
  • 第二个线程写映射数据。

如果图像是压缩的,将加快移动速度。

Tizen IVI例子

Tizen IVI使用原始图像并将其以bzip2压缩格式发布在download.tizen.org上,一起还有bmap文件。

我们以最新的Tizen IVI版本图像为例。 要保存到USB盘中,可以执行以下命令:

 $ bmaptool copy http://download.tizen.org/releases/milestone/tizen/ivi/latest/images/ivi-release-efi-i586/tizen_20130729.2_ivi-release-efi-i586-sdb.raw.bz2 /dev/usb_stick

直接从download.tizen.org下载。 另一种方法是,先下载图像和bmap文件,然后将其移到USB盘。 下面是要下载的文件:

  1. tizen_20130729.2_ivi-release-efi-i586-sdb.raw.bz2 (185MiB) - 压缩的Tizen IVI原始图像
  2. tizen_20130729.2_ivi-release-efi-i586-sdb.bmap (6.3KiB) - 图像的块映射

保证它们保存在同一个目录下。 使用下面的命令将图像保存到USB盘中:

 $ bmaptool copy <your_path>/tizen_20130729.2_ivi-release-efi-i586-sdb.raw.bz2 /dev/usb_stick