菜鸟科技网

Linux raw命令如何使用?

raw 命令主要用于直接访问和操作块设备(如硬盘分区、U盘、SD卡等)上的原始扇区数据,它绕过了文件系统(如 ext4, NTFS, FAT32),直接与设备硬件进行交互,这在数据恢复、低级格式化、磁盘镜像、嵌入式系统开发等场景下非常有用。

Linux raw命令如何使用?-图1
(图片来源网络,侵删)

核心功能与用途

raw 命令的核心功能是提供一个设备文件,让用户可以像访问普通文件一样,直接读写磁盘的物理扇区。

主要用途包括:

  1. 数据恢复

    • 当文件系统损坏时,可以使用 raw 命令直接读取磁盘扇区,尝试从底层恢复被删除或损坏的文件。
    • 一个被删除的文件,其数据可能仍然存在于磁盘上,只是文件系统的元信息(如 inode)被标记为可覆盖。raw 命令可以帮你把这些数据块“抓”出来。
  2. 磁盘镜像

    • 可以使用 dd 命令配合 raw 设备文件,创建一个磁盘的精确副本(镜像),这对于系统备份、克隆系统到多台机器或进行取证分析至关重要。
    • dd if=/dev/raw/raw1 of=/path/to/disk.img bs=4M
  3. 低级格式化/写入引导扇区

    Linux raw命令如何使用?-图2
    (图片来源网络,侵删)

    可以直接向磁盘的特定扇区(如主引导记录 MBR 或 GUID 分区表 GPT)写入数据,这在安装引导程序(如 GRUB)或修复引导扇区时非常有用。

  4. 嵌入式系统开发

    • 在开发嵌入式设备时,经常需要将整个操作系统(如 Yocto, Buildroot)或固件直接烧录到存储介质(如 eMMC, SD 卡)的特定偏移位置。raw 命令提供了精确的控制。
  5. 性能测试

    可以绕过文件系统的缓存和开销,直接测试磁盘的原始读写性能。

    Linux raw命令如何使用?-图3
    (图片来源网络,侵删)

如何使用 raw 命令

raw 命令的使用分为两步:

  1. 绑定:将一个 /dev/raw/ 下的设备文件(如 raw1)绑定到一个实际的块设备(如 /dev/sdb1)。
  2. 使用:像使用普通文件一样,通过 /dev/raw/raw1 来访问 /dev/sdb1 的原始数据。

前提条件

raw 命令通常需要 root 权限才能执行。

示例:将 raw1 绑定到 /dev/sdb1

假设你有一块 U 盘,系统识别为 /dev/sdb,并且上面有一个主分区 /dev/sdb1,你想直接访问这个分区的原始数据。

  1. 检查块设备 使用 lsblkfdisk -l 确认你的设备信息。

    $ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0 238.5G  0 disk 
    ├─sda1   8:1    0   512M  0 part /boot/efi
    └─sda2   8:2    0   238G  0 part /
    sdb      8:16   1  14.9G  0 disk  <-- 这是我们的U盘
    └─sdb1   8:17   1  14.9G  0 part  <-- 这是U盘的主分区
  2. 绑定设备 使用 raw 命令将 /dev/raw/raw1 绑定到 /dev/sdb1

    # sudo raw /dev/raw/raw1 /dev/sdb1
    • /dev/raw/raw1:这是你要创建的原始设备文件。raw0, raw1, raw2... 最多可以创建 8 到 64 个(取决于内核配置)。
    • /dev/sdb1:这是你要绑定的源块设备。
  3. 验证绑定 绑定成功后,/dev/raw/raw1 文件就会被创建,你可以检查它的权限和所有者,并查看它指向的设备。

    # ls -l /dev/raw/raw1
    brw-rw---- 1 root disk 162, 1 Dec 1 10:00 /dev/raw/raw1
    • b 表示这是一个块设备。
    • 162, 1 是它的主设备号和次设备号,这通常与 /dev/sdb1 的设备号一致,说明绑定成功。
  4. 使用原始设备 你可以使用任何命令来操作 /dev/raw/raw1,创建一个磁盘镜像:

    # dd if=/dev/raw/raw1 of=/home/user/usb_backup.img bs=4M

    这条命令会把 U 盘 /dev/sdb1 的所有内容备份到 usb_backup.img 文件中。

  5. 解除绑定 当你使用完毕后,应该解除绑定,释放资源。

    # raw /dev/raw/raw1 /dev/null

    /dev/raw/raw1 绑定到 /dev/null 就相当于解除了它之前的绑定。


raw 命令的详细选项

raw 命令本身非常简单,主要用法如下:

raw [OPTION] <rawdevice> <major> <minor>
raw [OPTION] <rawdevice> <existing-device>
raw -qa

选项说明:

  • -q--query:查询绑定状态。

    • raw -q /dev/raw/raw1:查询 raw1 的绑定情况。
    • raw -qa:查询所有 raw 设备的绑定情况。
  • -a--assign:显式地指定主设备号和次设备号来绑定,这是比较底层的方式。

    • 示例:raw /dev/raw/raw1 8 178/dev/sda 的主设备号,17/dev/sda1 的次设备号,这种方式不如直接指定设备名直观。
  • --remove:解除绑定。

    • 示例:raw --remove /dev/raw/raw1

两种绑定方式的区别

  1. 通过设备名绑定(推荐)

    raw /dev/raw/raw1 /dev/sdb1
    • 优点:简单直观,无需关心设备号,即使内核重新加载模块导致设备号变化,只要设备名(如 /dev/sdb1)不变,绑定关系依然有效。
    • 缺点:依赖于 udev 或类似机制来创建 /dev/sdb1 这样的设备文件。
  2. 通过设备号绑定

    raw /dev/raw/raw1 8 17
    • 优点:不依赖于 udev,在某些最小化系统或嵌入式环境中可能有用。
    • 缺点:不直观,如果设备号发生变化(插入其他磁盘导致 sdb 变成 sdc),绑定就会失效。

重要注意事项与警告

使用 raw 命令风险极高,操作不当会导致数据永久丢失。

  1. 数据丢失风险:直接写入磁盘会完全覆盖目标区域的数据,如果你错误地将 /dev/sda 绑定到 raw1 并写入数据,你的整个系统分区都可能被毁掉。

    • 黄金法则:在执行 dd 或其他写入命令前,务必再三确认 if=(输入)和 of=(输出)的参数是否正确!
  2. 需要 Root 权限:所有 raw 命令的操作都需要 sudoroot 用户执行。

  3. 设备文件不存在/dev/raw/ 目录下没有 raw1 这样的文件,你需要手动创建它们,在较新的 Linux 发行版中,udev 会自动创建它们,如果没有,可以手动创建:

    # mknod /dev/raw/raw1 b 162 1 
    # chown root:disk /dev/raw/raw1
    # chmod 660 /dev/raw/raw1

    1621 是你目标设备的主次设备号。

  4. 现代替代方案:在现代 Linux 系统中,raw 命令的功能在很大程度上被更现代、更安全的工具所取代,

    • losetup:用于创建回环设备,可以挂载一个文件(如磁盘镜像)像块设备一样使用。
    • ddrescue:比 dd 更强大的数据恢复和克隆工具,它会尝试读取和恢复坏扇区,而不是简单地失败。
    • kpartx:用于为磁盘镜像文件中的分区创建设备映射(如 /dev/loop0p1),方便直接访问分区。
特性 描述
功能 绕过文件系统,直接访问块设备的物理扇区。
用途 数据恢复、磁盘镜像、低级格式化、固件烧录。
风险 极高! 错误操作会导致数据永久丢失。
核心命令 sudo raw /dev/raw/raw1 /dev/sdXn (绑定)
查询 raw -qa (查询所有)
解除 sudo raw /dev/raw/raw1 /dev/null (解除绑定)
替代方案 losetup, ddrescue, kpartx

raw 是一个非常强大但危险的工具,适用于高级用户和特定任务,在使用它之前,请务必充分了解其工作原理,并始终对重要数据进行备份。

分享:
扫描分享到社交APP
上一篇
下一篇