我一直在寻找一种方法来刷新 scsi 总线(或任何其他总线,就此而言),这将允许我的内核(CentOS 5.5 上的 2.6.18-194-el5)了解驱动器上的分区,我不能没有办法。partprobe 立即做到了。如何?
由于这很重要,这就是我正在做的事情:
我想在特定于分区的事情上得到一些练习,比如调整大小、备份 MBR 和恢复它,等等。我在 /dev/sdb 上创建了一个 20GB 的分区,备份了 MBR:
dd if=/dev/sdb of=sdb.mbr bs=512 count=1
然后我进入fdisk,删除分区,写入,然后退出。
ls /dev/sdb*
显示没有分区,并且
fdisk -l /dev/sdb'
匹配,所以我认为我很好。
然后我颠倒了dd:
dd if=sdb.mbr of=/dev/sdb bs=512 count=1
当然,当时我什么也没做,所以
ls /dev/sdb*
没有列出任何分区,但是
fdisk -l
显示分区,大概是因为它读取磁盘上的前 512 个字节并且不依赖于内核。我知道我必须刷新总线,所以我进入/sys/class/scsi_host/host1,然后做了
回声“- - -” > 扫描
和做
ls /dev/sdb
没有显示任何新内容,所以我去了 /sys/bus/scsi/devices 并且对于列出的每个设备,我都做了
回声 1 > 重新扫描
那没有用。
然后我对该问题进行了更多研究,并遇到了parted 附带的'partprobe'。我运行了它,它立即生效。
如果我在这里没有得到可能的答案,我可能会去获取源代码并查找它,但我认为这里有超出我的巫师,所以我想我会吸引你们所有人。
我正在尝试在 GPT 磁盘上挂载分区,但出现以下错误:
$ sudo mount -t ext4 /dev/sda1 disk/
mount: special device /dev/sda1 does not exist
Run Code Online (Sandbox Code Playgroud)
查看 dmesg,我在 /dev/sda 上没有看到任何错误:
$ dmesg | grep sda
[ 1.367508] sd 0:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 1.367514] sd 0:0:0:0: [sda] 4096-byte physical blocks
[ 1.367607] sd 0:0:0:0: [sda] Write Protect is off
[ 1.367611] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 1.367654] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO …Run Code Online (Sandbox Code Playgroud) 当我运行 fdisk 并更改分区的大小时,fdisk 在其输出的末尾说:
The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8)
Run Code Online (Sandbox Code Playgroud)
我想这样做而不必重新启动(然后编写一个执行此操作的脚本) 如何使用kpartx正确执行此操作?我试过了:
kpartx -f -v /dev/mmcblk0
Run Code Online (Sandbox Code Playgroud)
哪些输出:
mmcblk0p1 : 0 102400 /dev/mmcblk0 2048
mmcblk0p2 : 0 7657472 /dev/mmcblk0 104448
Run Code Online (Sandbox Code Playgroud)
和:
kpartx -a -v /dev/mmcblk0
Run Code Online (Sandbox Code Playgroud)
输出:
device-mapper: reload ioctl on mmcblk0p1 failed: Invalid argument
create/reload failed on mmcblk0p1
add map mmcblk0p1 (0:0): 0 102400 linear /dev/mmcblk0 2048
device-mapper: reload ioctl on mmcblk0p2 failed: Invalid argument
create/reload failed on …Run Code Online (Sandbox Code Playgroud) 在阅读手册页时,fdisk我遇到了这段有趣的文字:
有几个 *fdisk 程序。每个人都有自己的问题和优势。按 cfdisk、fdisk、sfdisk 的顺序尝试它们。(确实,cfdisk 是一个漂亮的程序,它对它接受的分区表有严格的要求,并生成高质量的分区表。如果可以,请使用它。fdisk 是一个有缺陷的程序,它会做一些模糊的事情——通常它会产生合理的分区表)结果。它的唯一优点是它对 BSD 磁盘标签和其他非 DOS 分区表有一定的支持。如果可以,请避免使用它。sfdisk 仅供黑客使用 -- 用户界面很糟糕,但它比 fdisk 更正确,并且比 fdisk 和 cfdisk 都更强大。而且,它可以非交互地使用。)
我注意到两个应用程序的选项格式不同:
- melancholy():/$ sudo fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00036f1b
Device Boot Start End Blocks Id System …Run Code Online (Sandbox Code Playgroud) 我有一个 4096 字节扇区的磁盘:
# cat /sys/class/block/sda/queue/physical_block_size
4096
#
Run Code Online (Sandbox Code Playgroud)
出于某种原因,fdisk更喜欢使用 512 字节扇区显示有关磁盘的信息:
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Disk model: ST500DM002-1BD14
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x000d98d6
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 976773167 976771120 465.8G 83 Linux
Run Code Online (Sandbox Code Playgroud)
出于好奇,为什么fdisk更喜欢使用 512 字节的扇区大小?我正在使用fdisk版本2.33.1。
我正在尝试创建一个 bash 脚本,该脚本将在具有现有分区的磁盘上创建一个带有文件系统的新分区。
看起来用parted以编程方式创建分区很容易,但是它需要您知道从哪里开始和停止新分区,这就是我遇到麻烦的地方。
我不想依赖具有特定位置/大小的分区的磁盘。也就是说,我想在最后一个现有分区之后立即开始创建一个新分区。然后我希望能够创建固定大小的分区,或者填充剩余空间。
在 Bash 中,是否有可靠的方法来确定
a) 最后一个分区的结束位置,以及
b) 最后一个分区后剩余的未分区空间?
我目前正在安装 arch linux,当我尝试创建物理卷时,它给了我这个错误。
Can not use /dev/sda: device is partitioned
Run Code Online (Sandbox Code Playgroud)
这个错误是什么?我该如何消除它?
PS:我已经格式化了磁盘mkfs.ext4 /dev/sda
在我的系统 (Debian) 上,我可以看到UUID所有磁盘分区的标识符(即/dev/sda1, dev/sda2, ..)
ls /dev/disk/by-uuid/
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到自己的UUID标识符/dev/sda。是否可以引用整个磁盘UUID?
我需要这个是因为我想引用一个特定的磁盘,我不能相信它会被调用/dev/sda。
@don_crissti 建议的解决方案很棒。但是,我希望相同型号/制造商的所有硬盘的 UUID 相同,而不是序列号唯一。
使用udevadm,我可以看到磁盘属性:
udevadm info -n /dev/sda -a
ATTRS{model}=="Samsung SSD 840 "
ATTRS{vendor}=="0x8086"
ATTRS{class}=="0x010700"
ATTRS{device}=="0x1d6b"
....
Run Code Online (Sandbox Code Playgroud)
如何UUID从这些属性生成 a ,以便相同的 Model/Manufacturer 磁盘将具有相同的UUID?
fdisk -l 输出:
.
.
Disk label type: dos
Disk identifier: 0x0006a8bd
.
.
Run Code Online (Sandbox Code Playgroud)
什么是Disk label type和Disk identifier?
另外,除了手册之外,我还能在哪里找到有关磁盘管理/分区等的更多信息?
得到后
WARNING: Your hard drive is failing
Device: /dev/sdb [SAT], 1 Offline uncorrectable sectors
Run Code Online (Sandbox Code Playgroud)
我跑
$ sudo smartctl -a /dev/sdb
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-514.26.2.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Device Model: KingDian S200 60GB
Serial Number: 2017022100551
LU WWN Device Id: 0 000000 000000000
Firmware Version: P0707F1
User Capacity: 60,022,480,896 bytes [60.0 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Device is: Not in smartctl …Run Code Online (Sandbox Code Playgroud)