csatblogspotdotcom

Saturday, December 24, 2016

Ubuntu swap分区无法加载的解决

win7 VMware下Ubuntu 14.04 64位系统,guestOS挪到另一电脑后磁盘重新删除、添加,发现sudo fdisk -l结果中显示: ... Disk /dev/mapper/ubuntu--vg-root doesn't contain a valid partition table ... Disk /dev/mapper/ubuntu--vg-swap_1 doesn't contain a valid partition table 查了下据说逻辑卷都会被这样提示,不影响(从后面测试折腾来看,确实不影响,这个提示一直有) 进一步折腾发现 sudo parted /dev/sda print all 显示: ... Error: /dev/mapper/ubuntu--vg-swap_1: unrecognised disk label 这个就有问题了,继续执行free显示: ... Swap: 0 0 0 确实有问题,swap为0,没能被加载,sudo blkid结果里面也没有swap,而且/etc/fstab里面swap也没被注释掉,各种结果都正式swap加载有问题 继续用sudo pvdisplay、sudo vgdisplay、sudo lvdisplay(查询逻辑卷信息)查询一下,得知系统空间用的是逻辑卷,大小大概20G,其中18G用作Ubuntu存储目录,另外2G分给了swap,尝试手动挂载swap: sudo swapon /dev/mapper/ubuntu--vg-swap_1 和 sudo swapon /dev/ubuntu-vg/swap_1 (其实/dev/mapper/ubuntu--vg-swap_1和/dev/ubuntu-vg/swap_1是两个链接,均指向/dev/dm-1),均提示:swapon: /dev/mapper/ubuntu--vg-swap_1: read swap header failed: Invalid argument 继续查,网上有不少记录,Ubuntu官网就有两个相关问题贴:953875和1310058, https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/953875/ https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058/comments/22 指出是Ubuntu的一个bug,和加密软件有关,它把swap的UUID改变了 sudo blkid结果里面没swap的UUID,手动执行:sudo mkswap /dev/mapper/ubuntu--vg-swap_1,创建swap分区,执行结果显示了UUID,接下来将/etc/crypttab里面的UUID修改为正确的UUID(或者直接加-U参数指定UUID),另外在行的最后加一个“,offset=8”(8个512字节,网友测试6就可以了,有人建议8,有人1024;根据网友描述,按我的理解,前面那部分存储了UUID,而加密软件正好对这部分进行写操作,于是会改变UUID,所以swap从后面一点开始,避免被写导致,保持UUID不变),立马OK(不加offset也成功加载swap,结果和下面一样): sudo swapon -a 后 free显示: ... Swap: 2093052 0 2093052 但又出现新提示: swapon: /dev/mapper/cryptswap1: stat failed: No such file or directory locate cryptswap无结果,后来发现在/etc/fstab里面有两行关于swap的,开始我以为两行是相互配合的,现在看来是冲突了: /dev/mapper/ubuntu--vg-swap_1 none swap sw 0 0 /dev/mapper/cryptswap1 none swap sw 0 0 查看/dev/mapper/下面并无cryptswap1文件或文件夹,想了想,也没有加密的计划,越简单越好,于是注释掉后面行,执行: sudo swapoff -a sudo swapon -a free结果显示正常 Ubuntu官网那两个贴还建议:sudo update-initramfs -u,于是也执行了(虽然不懂有什么用) 另外fstab里面直接用UUID指定分区: UUID=185ed9d3-bb19-4a8c-bc86-e57b226e9676 none swap sw 0 0 也可以; 后面继续摸索:sudo /etc/init.d/cryptdisks reload 之后 再 sudo fdisk -l,结果多了一个/dev/mapper/cryptswap1, (执行sudo /etc/init.d/cryptdisks reload的时候swapoff一下,不然出现分区已经挂载之类的提示,可能和这个有关) 这时修改/etc/fstab,使能:/dev/mapper/cryptswap1 none swap sw 0 0 挂载:sudo swapoff -a 后 sudo swapon -a,成功,说明之前的/etc/init.d/cryptdisks是没有加载或者有冲突(可能是fstab里两个swap项冲突),fstab只保留一个cryptswap1重启后OK 简单总结下swap挂载不上的解决: 最简单的可以直接在/etc/fstab里添加:UUID=**** none swap sw 0 0,并删除其余swap项(获取UUID可通过:sudo blkid,结合ls -al /dev/disk/by-uuid/查看现有磁盘设备的UUID;sudo lvdisplay查看逻辑卷UUID即LV UUID,与UUID不一样),普通磁盘时建议此方式; 磁盘加密时建议此方式: 如果有装cryptdisks加密磁盘的工具(Ubuntu默认有),有/etc/crypttab,则检查里面UUID,或直接指定UUID重新创建swap分区:sudo mkswap -U **** /dev/mapper/ubuntu--vg-swap_1,或者sudo mkswap /dev/mapper/ubuntu--vg-swap_1后将结果中正确的UUID添加至crypttab对应的项;接下来在crypttab对应项后面加上“,offset=8”(避免UUID写在太前而被加密软件写操作覆盖改变);然后fstab中保留唯一的swap项:/dev/mapper/ubuntu--vg-swap_1 none swap sw 0 0,或者确保/etc/init.d/cryptdisks开机启动能正常加载后保留fstab里swap唯一项:/dev/mapper/cryptswap1 none swap sw 0 0;最后sudo update-initramfs -u。如果偶尔系统启动后swap不加载的情况,执行sudo /etc/init.d/cryptdisks reload 后 重新加载 sudo swapon -a 即可。 今天20161224,看了下系统文件大概是20160101凌晨装的系统,大概就是2015末2016初吧,整整一年,把guestOS从一台电脑挪到另一台电脑后,今天才发现swap问题,并于今天内解决 参考: Ubuntu官方bug贴953875和1310058: https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/953875/ https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058/comments/22 以及: http://askubuntu.com/questions/462775/swap-not-working-on-clean-14-04-install-using-encrypted-home http://askubuntu.com/questions/462739/14-04-with-fde-and-swap-is-missing 后记: 刚才重新运行了一会,发现sudo init 6重启后OK,但sudo init 0后开机就挂载不了swap,/var/log/boot.log中出现: device-mapper: rename ioctl on cryptswap1_unformatted failed: Device or resource busy 手动sudo /etc/init.d/cryptdisks reload 后 sudo swapon -a 又能挂载,不想折腾了,也没必要加密了,于是直接不用加密了,参考: https://www.logilab.org/blogentry/29155 https://webcache.googleusercontent.com/search?q=cache%3awww.logilab.org/blogentry/29155&hl=en&tbo=d&strip=1 (启用加密用 sudo ecryptfs-setup-swap )其中的描述: sudo swapoff -a sudo cryptsetup remove /dev/mapper/cryptswap1 sudo vim /etc/crypttab *remove the /dev/sda5 line* sudo /sbin/mkswap /dev/sda5 sudo swapon /dev/sda5 sudo vim /etc/fstab *replace /dev/mapper/cryptswap1 with /dev/sda5* 至于cryptdisks开机启动就不管了,没精力,也没必要,耗不了多少资源,而且万一以后要用呢 后记2(20161225): /etc/crypttab 里面直接用#注释掉就可以了,也可以删除行 刚发现/etc/rc2.d/和/etc/rc5.d/是一样的,执行runlevel显示是2,在/etc/rc2.d/里面没有cryptdisks而/etc/rc6.d/里面有S59cryptdisks-early,说明关机后启动系统进入runlevel 2是没有运行cryptdisks的,所以/dev/mapper/cryptswap1没法正常加载,而如果重启则是进入runlevel 6,有执行S59cryptdisks-early,所以能正常加载/dev/mapper/cryptswap1,swap正常挂载。 小结一下: 如果不需要磁盘加密(不运行cryptdisks),/etc/fstab里直接 UUID=**** none swap sw 0 0 或 /dev/mapper/ubuntu--vg-swap_1 none swap sw 0 0 并注释掉其余swap项; 如果有磁盘加密(运行cryptdisks),/etc/fstab里 /dev/mapper/cryptswap1 none swap sw 0 0 并注释掉其余swap项,同时保证开机启动项/etc/rc*.d/里面cryptdisks正常启动,而且cryptdisks配置正常:/etc/crypttab里面UUID正确而且行末加“,offset=8”避免前几个写有UUID的地方被写覆盖;如果cryptdisks异常则执行sudo /etc/init.d/cryptdisks reload 后 重新加载 sudo swapon -a 磁盘加密或不加密两种情况下如有修改系统文件则执行sudo update-initramfs -u更新一下 后记20170212: 修改/etc/fstab后重新加载生效的命令是mount -a即挂载所有,umount -a是卸载所有

Labels: , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home