你如何用/ dev / sdb交换/ dev / sda?

时间:2013-08-24 19:47:48

标签: linux linux-kernel device

男孩,就是这样。一个。不重要的。问题,然而似乎没有人能够正确回答它。

如何将/ dev / sda与/ dev / sdb交换?

有人可以建议使用永久标签(例如/ dev / disk / by- *),但尽管有最好的意图,但 NOT 回答了这个问题。是的,永久的labellings在你可以使用它们的地方工作,但如果一个程序被硬编码使用,例如。 / dev / sda,这个问题仍然存在。

为了进一步说明我在互联网上发现的问题: http://ubuntuforums.org/showthread.php?t=1569238&page=2(让我想起'Schadenfreude')

这个小伙子似乎找到了解决方案,只是没有分享它(嘘!): http://ubuntuforums.org/showthread.php?t=944515

而且,我有类似的潜在危险。我使用CloneZilla,如果一个程序问:Would you like to backup /dev/sda to /dev/sdb or /dev/sdb to /dev/sda ?,猜猜我知道linux似乎随机分配磁盘命令是多么紧张。我还没有用我自己的备份覆盖我的数据,但这只是等待发生。

Linux中的内容将/ dev / sd *分配给磁盘,您如何影响此过程?这与udev(/ etc / udev /,udevadm)有关吗?我的操作系统是CentOS,但我也需要知道Ubuntu和CloneZilla(http://clonezilla.org),这个问题发生在所有系统上,所以我的猜测是这个问题与分发无关,而是与内核,内核模块或非常接近内核的东西。请帮忙!

------------------编辑:2013年8月25日 在建议ypnos给出的链接之后,我读了所有内容,尝试了一个命令,内核只是'vommitted'udev规则在我的屏幕上。然后提示输入root密码以允许维护,或退出以重新启动。这证明这些东西确实不适合初学者。

我也进一步查看了一下。我不明白linux内核是如何或何时加载的,但是互联网上的几条消息表明BIOS(不管你信不信)将可激活磁盘列表传递给grub,然后使用device.map文件分配grub(hd *,)的设备。请注意,/ dev / sd 已在此阶段定义,因为您可以使用永久性开发符号链接。这些设备映射似乎以某种方式传递给实际的根文件系统。那么现在这是一个引导程序的东西吗?

回到udev作为一个潜在的解决方案,我在google http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=578826上找到了一个bug报告,这导致了一个解决方案,它被视为无法改变udev NAME(最终将成为/ dev / sd * as我们知道。)

对于建议的udev MAN页面:

| The following keys can get values assigned:
| 
| NAME
|  The name of the node to be created, or the name the network
|  interface should be renamed to.
   NOTE: changing the kernel-provided name of device nodes
   (except for network devices) is not supported and can result
   in unexpected behavior.
   Today, the kernel defines the device nodes names, and udev
   is expected to only manage the node's permissions and
   additional symlinks.

......但是我还是以略微改变的方式出去做了。

# vi /etc/udev/rules.d/00-corrections.rules

KERNEL=="sd?", ATTRS{model}=="SAMSUNG SP0411N", NAME="sda"
KERNEL=="sd??", ATTRS{model}=="SAMSUNG SP0411N", NAME="sda%n"
KERNEL=="sda", ATTRS{model}!="SAMSUNG SP0411N", NAME="sdb"
KERNEL=="sda?", ATTRS{model}!="SAMSUNG SP0411N", NAME="sdb%n"

基本上,它的作用是“如果模型是三星,请指定NAME sda *。如果型号不是三星,但已经分配了sda *,请为其指定NAME sdb *。”该规则尽可能放在所有其他规则之前。请注意,我不确定这一点,因为似乎还有一些“隐形”规则文件,虽然你已经重命名了设备,但是内核加载内存中的内核仍然可能引用错误。当您查看/var/log/boot.log文件时,这可能是显而易见的,在我的情况下,它开头说:

%G      Welcome to [0;36mCentOS[0;39m 
Starting udev: %G[60G[[0;32m  OK  [0;39m]Setting hostname UncleFloServer:  [60G[[0;32m  OK  [0;39m]ERROR: asr: seeking device "/dev/sda" to 5999998795264
ERROR: ddf1: seeking device "/dev/sda" to 5999998795264
ERROR: ddf1: seeking device "/dev/sda" to 5999998664192
ERROR: hpt45x: seeking device "/dev/sda" to 5999998790144
ERROR: isw: seeking device "/dev/sda" to 5999998794752
ERROR: jmicron: seeking device "/dev/sda" to 5999998795264
ERROR: lsi: seeking device "/dev/sda" to 5999998795264
ERROR: nvidia: seeking device "/dev/sda" to 5999998794752
ERROR: pdc: seeking device "/dev/sda" to 137438913024
ERROR: pdc: seeking device "/dev/sda" to 137438920192
ERROR: pdc: seeking device "/dev/sda" to 137438927360
ERROR: pdc: seeking device "/dev/sda" to 137438934528
ERROR: sil: seeking device "/dev/sda" to 5999998795264
ERROR: via: seeking device "/dev/sda" to 5999998795264
Setting up Logical Volume Management:   No volume groups found
[60G[[0;32m  OK  [0;39m]Checking filesystems
_CentOS-6.4-x86_: clean, 85517/655360 files, 662649/2621440 blocks
/dev/sda1: clean, 56/65536 files, 33367/262144 blocks
[60G[[0;32m  OK  [0;39m]Remounting root filesystem in read-write mode:  [60G[[0;32m  OK  [0;39m]Mounting local filesystems:  [60G[[0;32m  OK  [0;39m]Enabling local filesystem quotas:  [60G[[0;32m  OK  [0;39m]Enabling /etc/fstab swaps:  [60G[[0;32m  OK  [0;39m]

在这里,我的三星设备是40GB(我想作为/ dev / sda),我的大槟榔Raid是6TB(我想作为/ dev / sdb)。

剩下的一些问题仍然存在

  1. 错误是什么意思?

  2. 这些错误是内核的原因,还是在udev的00-corrections.rules之前仍然运行规则文件的原因?

  3. 这些错误是否表明存在数据威胁? Areca分区在fstab中的某个文件夹上没有安装任何问题。

  4. 是否有更好的早期设备分配方法?

4 个答案:

答案 0 :(得分:11)

目前,Linux内核根据UDEV规则动态填充/ dev /。

首先让我解释设备文件的工作原理。每个设备文件(通常是块设备文件)都有一个主编号和一个次编号。这些数字实际上描述了文件指向的设备。这个名字在这方面没有任何作用。我们来看看我们的特定磁盘情况:

# ls -l sd*
brw-rw---- 1 root disk 8, 0 Aug 22 15:45 sda
brw-rw---- 1 root disk 8, 1 Aug 22 15:45 sda1
brw-rw---- 1 root disk 8, 2 Aug 22 15:45 sda2
brw-rw---- 1 root disk 8, 3 Aug 22 15:45 sda3
brw-rw---- 1 root disk 8, 5 Aug 22 15:45 sda5
brw-rw---- 1 root disk 8, 6 Aug 22 15:45 sda6

在这里你看到我的第一个磁盘有各种分区,我在8月22日下午3点启动,这是内核根据规则创建文件的时间。您还可以看到主要数字是8,次要数字用于访问分区(0指向整个磁盘)。每行开头的'b'表示每个都是一个特殊的“块设备”文件。

正如我所说,内核动态创建文件“这些天”。它并不总是那样,并且它不像其他Unix系统那样。在那里,文件将静态创建,用户将创建或操作这些文件。

完全可以使用您自己的名称和主要/次要编号创建您自己的设备文件。请参阅 mknod man mknod)。但是,再次启动后,您的自定义文件将消失。

第二种可能性是改变UDEV规则。规则将在系统引导期间处理,并保证您的行为永久一致。有关这些规则的详细指南,请访问:http://www.reactivated.net/writing_udev_rules.html

您将看到,在给定与您的设备匹配的特定硬件信息的情况下,可以定义创建“sda *”的规则。您需要替换将与您创建sda的原始规则。这是如何工作的取决于你的分布。

我认为这对新手来说是一项危险的事情,我不会向你解释具体的步骤;我上面链接的文件将为您提供所需的所有信息,您确实应该阅读所有信息。

答案 1 :(得分:1)

我在交换sdasdb磁盘名称时遇到相同的问题。我试图在我自己的HP服务器上用上述文章编写一些类似的udev规则。但是我使用了/etc/udev/rules.d/00-corrections.rules

中的磁盘大小
KERNEL=="sd?", ATTR{size}=="781357232", NAME="sda"
KERNEL=="sd??", ATTRS{size}=="781357232", NAME="sda%n"
KERNEL=="sda", ATTR{size}=="3125515952", NAME="sdb"
KERNEL=="sda?", ATTRS{size}=="3125515952", NAME="sdb%n"

在使用此规则之前,我先按cat /sys/block/sda/sizecat /sys/block/sdb/size找到设备的大小,在这里进行描述:Finding information from sysfs

但是当我尝试通过udevadm test /sys/block/sdb测试udev规则时,我在输出中看到以下行:

NAME =“ sda”被忽略,内核设备节点无法重命名;请在/etc/udev/rules.d/00-corrections.rules:1

中修复它

我有ubuntu 18.04,根据这篇文章Is there a way to change device names in /dev directory?

,我发现这是不可能的(至少在ubuntu 18.04中)

答案 2 :(得分:-1)

为什么不使用UUID而不依赖于动态分配? SD?永远是动态的,而UUID是固定值并且不会改变,即使您更改,发行版或者如果您在其他Linux机器上安装硬盘驱动器,UUID也将是相同的。

sudo blkid将显示UUID,然后您可以在fstab上使用它来在任何地方安装分区。

答案 3 :(得分:-2)

据我所知,这是不可能的。系统将选择SATA端口1作为SDA,依此类推。但是,您可以使用smartctl识别SDA / B的序列号或尽可能闪存驱动器LED。