Linux的luks设备上的分区名字的一个现象
在研究Linux使用cryptsetup加密设备时遇到一个现象,很有(e)趣(xin),所以作一个记录。
首先是建立一个luks设备,然后使用命令cryptsetup luksOpen /dev/sde crypt-test挂载到/dev/mapper/crypt-test设备上,
然后使用parted建立分区,完成之后执行fdsk -l可以看到分区的设备名是/dev/mapper/crypt-test1和/dev/mapper/crypt-test。
fdisk -l|grep "/dev/mapper/crypt-test"
/dev/mapper/crypt-test1 2048 976895 974848 476M Linux filesystem
/dev/mapper/crypt-test2 976896 2095103 1118208 546M Linux filesystem
然后正常使用,没有问题。
直到有一次想在SNAP应用里访问这两个分区,问题来了:找不到设备!检查代码无果,只好在SNAP应用里加了fdisk -l|grep "/dev/mapper/crypt-test"命令,发现分区设备的名字变了,变成下面这样了:
/dev/mapper/crypt-test1 2048 976895 974848 476M Linux filesystem
/dev/mapper/crypt-test2 976896 2095103 1118208 546M Linux filesystem
难怪找不到。
最初以为是什么地方没初始化对,反复修改,挂载,重启,现象不变。在反复重启之后有一次我忘了执行partprobe就用fdisk查看设备名,发现跟SNAP应用里得到的结果居然是一样的,在执行partprobe之后,就变成正常的/dev/mapper/crypt-test1和/dev/mapper/crypt-test2了。
估计是分区挂载之后设备管理器修正了名字,但SNAP里运行环境是挂载之前的。只不过没时间看源代码,所以真正的原因也不清楚。只是做了一个脚本来处理这个问题。
dev='/dev/mapper/crypt-test' #宿主设备名
partfix='' #分区名前缀,如果宿主设备结尾是数字,就是p,如果不是数字,就是''
for i in `fdisk -l|awk '{print $1}'|grep $dev|sed "s#$dev##"`;do #遍历设备并且去掉分区设备前面的磁盘设备名
a=$dev$i; #/dev/xxxp1或者/dev/xxx1
b=$dev`echo $i|sed "s@^$partfix@-part@"`; #/dev/xxx-part1
for x in `ls $dev*`;do #列出宿主设备下的所有子(分区)设备名
if [ "$x" = "$b" ];then #跟-partindex形式匹配,用/dev/xxxx-partindex形式
echo $b;
a='';
b='';
else
if [ "$x" = "$a" ];then #跟fdisk列出的名字匹配,用这个
echo $a;
a='';
b='';
fi;
fi;
done;
done
现在好了,不论设备名是哪种表现形式,都能取得正确的名字供使用了。