通过dd创建asm disk

本文档详细介绍了在Linux环境下使用ASM时遇到的多种错误及其解决方案,包括权限不足、无法打开磁盘文件等问题,并提供了具体的修改文件权限及设置发现路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题0:raw /dev/raw/raw10 /dev/loop11 后没有raw10生成

重启后有了

docker stop oracle19casmlhr

使用losetup实现linux普通文件做asm disk

如何创建ASM磁盘

ASM管理

问题1:ORA-15260: permission denied on ASM disk group

解决方案:

sqlplus / as sysasm

问题2:ORA-15031: disk specification ‘/dev/raw/raw10’ matches no disks

SYS@+ASM> create diskgroup xff external redundancy disk '/dev/raw/raw10';
create diskgroup xff external redundancy disk '/dev/raw/raw10'
*
ERROR at line 1:
ORA-15018: diskgroup cannot be created
ORA-15031: disk specification '/dev/raw/raw10' matches no disks
ORA-15025: could not open disk "/dev/raw/raw10"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 42
Additional information: 1241279430721
Additional information: 68719476736

解决方案:

chmod 660 /dev/raw/raw1
chown oracle:dba /dev/raw/raw1

问题3:ORA-15031: disk specification ‘/dev/raw/raw10’ matches no disks

SYS@+ASM> create diskgroup xff external redundancy disk '/dev/raw/raw10';
create diskgroup xff external redundancy disk '/dev/raw/raw10'
*
ERROR at line 1:
ORA-15018: diskgroup cannot be created
ORA-15031: disk specification '/dev/raw/raw10' matches no disks
ORA-15014: path '/dev/raw/raw10' is not in the discovery set

解决方案:

alter system set asm_diskstring='/dev/raw/*';

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何编译多阶段引导程序并使用dd命令写入虚拟磁文件。用户已经提供了一些参考引用,我需要结合这些信息来构建一个清晰的教程。 首先,用户提到的引用[4]提到使用NASM编译bootsect.asm生成bootsect.bin,并且大小是1个扇区,512B。这说明编译引导程序的第一步是使用NASM汇编器将汇编代码编译成二进制文件。同时,引用[1]和[3]展示了使用dd命令将文件写入磁镜像的不同例子,其中涉及skip、seek、bs等参数。引用[2]则展示了通过挂载镜像并复制文件的方法,但用户可能更关注直接使用dd命令的方式,因为问题中明确提到了dd命令。 接下来,我需要明确步骤。编译多阶段引导程序可能涉及多个汇编文件,例如引导扇区(如bootsect.asm)和后续的加载程序(如loader.asm)。每个阶段都需要单独编译成二进制文件,然后按照顺序写入磁镜像的相应位置。通常,引导扇区位于磁的第一个扇区(即偏移0),而后续的加载程序可能位于后续的扇区。 需要注意的是,dd命令的参数设置非常重要。例如,写入引导扇区时,应该使用of=disk.img,并且不需要跳过或寻找,因为引导扇区在镜像的起始位置。而后续的加载程序可能需要写入到其他扇区,这时候需要计算正确的偏移量,使用seek参数来指定写入的位置。例如,如果加载程序需要从第二个扇区开始,seek=1(因为一个扇区通常是512字节,bs=512的情况下,seek=1即跳过第一个扇区)。 另外,用户提到“多阶段引导程序”,这可能意味着引导扇区(bootsect.bin)负责加载第二个阶段的程序(loader.bin),因此这两个文件需要分别编译并写入磁镜像的不同位置。例如,bootsect.bin写入第一个扇区,loader.bin从第二个扇区开始写入。 需要验证每个步骤的正确性,例如编译后的文件大小是否符合预期,是否超过目标扇区的容量。例如,引导扇区必须是512字节,并且最后的两个字节为0x55和0xAA,作为引导扇区的标志。如果编译后的文件超过这个大小,可能会导致问题。 可能遇到的问题包括:dd命令参数错误导致写入位置不正确,编译后的二进制文件没有正确结束标志,或者多个阶段之间的跳转地址不正确。因此,在教程中应该提醒用户检查这些关键点。 最后,整合所有步骤,给出具体的命令示例,并解释每个参数的作用,确保用户能够理解并正确执行。同时,参考用户提供的引用,正确标注引用来源,比如dd命令的示例来自引用[1]和[4]。</think>### 分步教程:编译多阶段引导程序并写入虚拟磁 #### 1. 编写并编译引导程序 多阶段引导程序通常包含**引导扇区程序**(如`bootsect.asm`)和**第二阶段的加载程序**(如`loader.asm`)。 **步骤:** - 使用NASM汇编器编译源代码为二进制文件: ```bash nasm bootsect.asm -o bootsect.bin # 引导扇区程序[^4] nasm loader.asm -o loader.bin # 第二阶段加载程序 ``` **注意:** - 引导扇区程序`bootsect.bin`必须严格为**512字节**,且末尾包含`0x55AA`标志。 - 第二阶段程序`loader.bin`的大小需根据实际功能调整。 --- #### 2. 创建虚拟磁镜像 使用`dd`命令生成一个空白磁镜像文件`disk.img`: ```bash dd if=/dev/zero of=disk.img bs=512 count=2880 # 创建1.44MB软镜像[^3] ``` 参数说明: - `if=/dev/zero`: 输入为全零填充 - `bs=512`: 每个扇区512字节 - `count=2880`: 总扇区数(1.44MB = 512B × 2880) --- #### 3. 将程序写入磁镜像 **引导扇区写入(第一阶段):** ```bash dd if=bootsect.bin of=disk.img bs=512 count=1 conv=notrunc ``` - `conv=notrunc`: 保留镜像原有内容,仅覆盖指定部分[^1] - `count=1`: 仅写入1个扇区(引导扇区) **加载程序写入(第二阶段):** ```bash dd if=loader.bin of=disk.img bs=512 seek=1 conv=notrunc ``` - `seek=1`: 跳过第一个扇区,从第二个扇区开始写入[^1] --- #### 4. 验证与测试 - **检查二进制文件大小:** ```bash stat -c "%s" bootsect.bin # 必须等于512 ``` - **使用虚拟机验证:** 通过Bochs或QEMU加载`disk.img`,观察引导过程是否正常。 --- ### 关键问题说明 1. **为何需要`seek`参数?** 引导扇区固定位于磁第一个扇区,后续程序需按逻辑地址偏移写入,例如`seek=1`表示跳过引导扇区[^1]。 2. **如何调试引导程序?** 可在Bochs中启用调试模式,或使用`hexdump -C disk.img`查看二进制内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值