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

Flo*_*ens 12 linux device linux-kernel

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

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

有人可以建议使用永久标签(例如/ dev/disk/by-*),但尽管有最好的意图,但这并不能回答这个问题.是的,永久的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给出的链接之后,我读完了所有内容,尝试了一个命令,内核只是'呕吐'udev规则在我的屏幕上.然后提示输入root密码以允许维护,或退出以重新启动.这证明这个东西确实不适合初学者.

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

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

对于建议的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.
Run Code Online (Sandbox Code Playgroud)

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

# 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"
Run Code Online (Sandbox Code Playgroud)

从本质上讲,它的作用是"如果模型是三星,请指定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]
Run Code Online (Sandbox Code Playgroud)

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

其余一些问题仍然存在

  1. 这些错误意味着什么?

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

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

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

ypn*_*nos 14

目前,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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  • 好的,我尝试了以下内容:`#vi /etc/udev/rules.d/00-corrections.rules`\n`KERNEL=="sd?",ATTRS {model} =="SAMSUNG SP0411N",NAME = "sda"\n KERNEL =="sd ??",ATTRS {model} =="SAMSUNG SP0411N",NAME ="sda%n"\n KERNEL =="sda",ATTRS {model}!="SAMSUNG SP0411N ",NAME ="sdb"\n KERNEL =="sda?",ATTRS {model}!="SAMSUNG SP0411N",NAME ="sdb%n"`时间会判断这是否可靠,也适用于其他操作系统.我会写一个更广泛的指南. (2认同)