1:

1:

我有双启动系统(Windows 10 和 Ubuntu,Windows 快速启动已关闭),因此硬盘上有许多分区。启动时,USB 驱动器在 Ubuntu 上映像良好,并且以您期望的所有方式运行。

但是,当我安装硬盘的 Microsoft 数据分区时(至少我几乎确定这是原因),您无法再格式化 USB 或以任何方式对其进行映像处理。

我试过了dd,事实上,这就是我需要它工作的地方,因为使用dd比使用 Ubuntu 启动盘创建器容易得多(如果有人想知道的话,我正在设计一个操作系统,而且即使没有 USB 问题,它也已经足够困难了!!!)。我无法安装它,因为它缺少上次成像的文件系统。但是,如果我在访问 Microsoft 之前对其进行格式化(或者您稍后会看到发生的错误),它可以像普通 USB 磁盘一样正常工作。我只是无法重新格式化它。

以下是错误截图:

在此处输入图片描述

如果您有任何疑问或需要了解更多详细信息,请询问我。

命令:

root@my_comp:/# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             6100104       0   6100104   0% /dev
tmpfs            1224076    9820   1214256   1% /run
/dev/sda5      382559396 9121780 353981616   3% /
tmpfs            6120368   51716   6068652   1% /dev/shm
tmpfs               5120       4      5116   1% /run/lock
tmpfs            6120368       0   6120368   0% /sys/fs/cgroup
/dev/sda1         262144   30636    231508  12% /boot/efi
tmpfs            1224076      48   1224028   1% /run/user/1000
/dev/sr0         4442656 4442656         0 100% /media/devepere/BOPC_1E1

这是有道理的,因为磁盘上实际上没有文件系统:它被完全覆盖了,而且我还没有在引导加载程序中实现 FAT 表。

root@my_comp:/# parted -ls
Model: ATA HGST HTS721010A9 (scsi)
Disk /dev/sda: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name                          
Flags
 1      1049kB  274MB   273MB   fat32           EFI system partition          
boot, esp
 2      274MB   290MB   16.8MB                  Microsoft reserved 
partition  msftres
 3      290MB   589GB   588GB   ntfs            Basic data partition          
msftdata
 5      589GB   987GB   398GB   ext4
 6      987GB   1000GB  12.8GB  linux-swap(v1)
 4      1000GB  1000GB  523MB   ntfs            Basic data partition          
hidden, diag


Model: Generic Flash Disk (scsi)
Disk /dev/sdb: 1028MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1028MB  1027MB  primary


Warning: Unable to open /dev/sr0 read-write (Read-only file system).  
/dev/sr0 has been opened read-only.
Error: /dev/sr0: unrecognised disk label
Model: TSSTcorp CDDVDW SU-228GB (scsi)
Disk /dev/sr0: 4549MB
Sector size (logical/physical): 2048B/2048B
Partition Table: unknown
Disk Flags: 

我还忘了说我的电脑里有一张游戏盘,即 sr0。它不应该读取“msdos”,因为上面没有真正的分区。

root@my_comp:/# lsblk -f
NAME   FSTYPE  LABEL    UUID                                 
MOUNTPOINT
sda                                                          
├─sda1 vfat    SYSTEM   92EA-85A0                            /boot/efi
├─sda2                                                       
├─sda3 ntfs    OS       128AECEA8AECCAF5                     
├─sda4 ntfs    RECOVERY 18565C8D565C6D8E                     
├─sda5 ext4             d59773a2-e22e-4e57-945e-6d447600da16 /
└─sda6 swap             1ac79668-effe-46bc-9f71-6686c3ad8fcf [SWAP]
sr0    iso9660 BOPC_1E  2006-10-12-03-54-00-00               
/media/devepere/BOP

再次,没有文件系统,所以这很有意义。

root@my_comp:/# lsblk -m
NAME     SIZE OWNER       GROUP MODE
sda    931.5G YANN-MARTEL disk  brw-rw----
├─sda1   260M YANN-MARTEL disk  brw-rw----
├─sda2    16M YANN-MARTEL disk  brw-rw----
├─sda3   548G YANN-MARTEL disk  brw-rw----
├─sda4   499M YANN-MARTEL disk  brw-rw----
├─sda5 370.8G YANN-MARTEL disk  brw-rw----
└─sda6    12G YANN-MARTEL disk  brw-rw----
sr0      4.2G YANN-MARTEL cdrom brw-rw----

澄清一下,我完全地定期覆盖磁盘,因为这是我测试操作系统的方法。没有分区表。我的问题是,收到此错误后,我无法再写入它:就好像操作系统失去了写入 USB 驱动器或以任何方式格式化它的所有能力。

顺便说一句,我映像过的每个 USB 驱动器上都会发生这种情况,因此它绝对是 ubuntu 本地的。

进一步编辑...

1:

我使用 Linux 的自带“磁盘”应用程序测试格式化 USB。错误通常在我执行此操作时(或之前)弹出,尽管有时在启动后不久就会弹出,并且当我打开磁盘上的 Microsoft 分区时会一直弹出,在这种情况下,我使用的是 nautilus,因此 gnome 应用程序会失败。

我所知道的是,出现错误后,USB 没有响应写入尝试。dd 将运行并完成,但运行时间明显减少,并且实际上并不会写入磁盘。

2:

我的图像确实包含 MBR 扇区,其通常结尾为0xAA55,但是不包含任何类型的文件系统(或分区表)我正在创建一个全新操作系统(和引导加载程序),并且还没有实现分区表,因为我必须自己编写。

3:

根据记录,lsblk没有标志实际上确实在错误前后将 USB 显示为一个块:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
[...]
sdb      8:16   1   980M  0 disk 
[...]

是的,大小是正确的;这是一个相当旧的 USB 驱动器。我插入 32 GB 的驱动器,得到的东西看起来像 32 GB。

这是lsblk -f错误因某种原因触发之前的情况:

NAME   FSTYPE  LABEL    UUID                              MOUNTPOINT
sda                                                          
├─sda1 vfat    SYSTEM   92EA-85A0                            /boot/efi
├─sda2                                                       
├─sda3 ntfs    OS       128AECEA8AECCAF5                     
├─sda4 ntfs    RECOVERY 18565C8D565C6D8E                     
├─sda5 ext4             d59773a2-e22e-4e57-945e-6d447600da16 /
└─sda6 swap             1ac79668-effe-46bc-9f71-6686c3ad8fcf [SWAP]
sdb                
sr0    iso9660 BOPC_1E  2006-10-12-03-54-00-00    
/media/devepere/BOP

您可以清楚地看到该磁盘(sdb)已被识别,并且没有与之关联的文件系统。

为了进一步推理,以下是我尝试安装未格式化的 USB 磁盘时发生的情况:

mount: wrong fs type, bad option, bad superblock on /dev/sdb,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

4:

此驱动器使用 MBR 引导加载程序,没有任何类型的分区表,因此我的 UEFI 启动游戏 PC(我现在正在使用的)很难识别。因此,我有一台更老的“测试”计算机,只需要引导签名即可将引导加载程序加载到内存中,因为我希望在让它在每台机器上都可引导之前,确实有东西可以引导。

因此,它无法在大多数机器上启动。

但是,我在普通电脑上编写代码,将其编译成二进制映像,然后将该映像写入我的 USB 驱动器。我的意思是,在触发错误之前,此映像过程运行正常。

尽管当错误发生时,无论如何,从那时起我就无法写入 USB。这是开发中的一个主要问题,因为我实际上不能在没有先测试的情况下编写 10 行汇编代码,否则我将花费三倍的时间来调试代码,因为我根本不知道它出了什么问题。

感谢您的时间,我知道这篇文章非常长。

答案1

原来,问题的原因是有时候使用时忘记插入USB dd,或者USB端口本身松动。

我在编译程序并运行命令的 shell 脚本中添加了以下几行dd

lsusb -d 0781:5530
! [[ $? = 0 ]] && { echo "please plug in the sandisk cruzer usb before proceeding"; exit 1; }

详细而冗长的解释:

lsusb列出所有可用的 USB,或者根据您的参数列出其中的子集。我通过特定的产品编号获取 USB,这意味着我只能使用一个特定的 USB,除非我更改值。例如,该特定编号与我的 sandisk cruzer 相关,因此我只能插入那个,除非我lsusb不带参数运行,检查我的 USB 在哪里,然后获取 ID 并将其替换为旧的。

如果lsusb未找到特定设备,它将返回错误代码。保存$?该错误代码,并且通常在 shell 脚本中是上次运行的进程的退出代码。Linux 进程(我想其他进程也是如此)在成功时返回 0,因此在运行不成功时(即未插入 USB),它将返回 0 以外的其他值。

在 Bash 脚本中,表示[[ (condition) ]]条件, 表示!NOT 运算符,换句话说,如果条件返回 true 或 false, 则返回相反的结果。注意:比较时!不要使用。==

运算&&符的基本含义是,如果前一个条件为真,则执行程序右边的任何内容。顺便说一下,||除了条件返回假的情况外,其工作方式相同。

{ (command); (command); ... }是一组依次执行的命令。第一个命令的输出不会输入到第二个命令中;它就像一个列表。您也可以让函数实现相同的目的。

echo与以往一样:只是输出作为参数的文本。

exit 1以错误代码结束程序1(因为失败)。它放在最后是因为你想在结束程序之前运行 echo。

相关内容