![GlusterFS 在 Ubuntu 14.04 启动时无法挂载](https://linux22.com/image/636965/GlusterFS%20%E5%9C%A8%20Ubuntu%2014.04%20%E5%90%AF%E5%8A%A8%E6%97%B6%E6%97%A0%E6%B3%95%E6%8C%82%E8%BD%BD.png)
之前我问过在 Ubuntu 12.04 服务器启动时安装 GlusterFS答案是,这在 12.04 中存在错误,但在 14.04 中可以正常工作。出于好奇,我在笔记本电脑上运行的虚拟机上尝试了一下,在 14.04 中它可以正常工作。由于这对我来说至关重要,我决定将正在运行的服务器升级到 14.04,结果发现 GlusterFS 也没有自动挂载本地主机卷。
这是一个 Linode 服务器,fstab 如下所示:
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/xvda / ext4 noatime,errors=remount-ro 0 1
/dev/xvdb none swap sw 0 0
/dev/xvdc /var/lib/glusterfs/brick01 ext4 defaults 1 2
koraga.int.example.com:/public_uploads /var/www/shared/public/uploads glusterfs defaults,_netdev 0 0
启动过程如下(围绕网络安装部分,这是唯一的失败):
* Stopping Mount network filesystems [ OK ]
* Starting set sysctls from /etc/sysctl.conf [ OK ]
* Stopping set sysctls from /etc/sysctl.conf [ OK ]
* Starting configure virtual network devices [ OK ]
* Starting Bridge socket events into upstart [ OK ]
* Starting Waiting for state [fail]
* Stopping Waiting for state [ OK ]
* Starting Block the mounting event for glusterfs filesystems until the [fail]k interfaces are running
* Starting Waiting for state [fail]
* Starting Block the mounting event for glusterfs filesystems until the [fail]k interfaces are running
* Stopping Waiting for state [ OK ]
* Starting Signal sysvinit that remote filesystems are mounted [ OK ]
* Starting GNU Screen Cleanup [ OK ]
我相信日志文件/var/log/glusterfs/var-www-shared-public-uploads.log
包含了问题的主要线索,因为它是这台服务器(其中挂载不起作用)和我的本地虚拟服务器(其中挂载起作用)之间唯一真正不同的文件:
[2014-07-10 05:51:49.762162] I [glusterfsd.c:1959:main] 0-/usr/sbin/glusterfs: Started running /usr/sbin/glusterfs version 3.5.1 (/usr/sbin/glusterfs --volfile-server=koraga.int.example.com --volfile-id=/public_uploads /var/www/shared/public/uploads)
[2014-07-10 05:51:49.774248] I [socket.c:3561:socket_init] 0-glusterfs: SSL support is NOT enabled
[2014-07-10 05:51:49.774278] I [socket.c:3576:socket_init] 0-glusterfs: using system polling thread
[2014-07-10 05:51:49.775573] E [socket.c:2161:socket_connect_finish] 0-glusterfs: connection to 192.168.134.227:24007 failed (Connection refused)
[2014-07-10 05:51:49.775634] E [glusterfsd-mgmt.c:1601:mgmt_rpc_notify] 0-glusterfsd-mgmt: failed to connect with remote-host: koraga.int.example.com (No data available)
[2014-07-10 05:51:49.775649] I [glusterfsd-mgmt.c:1607:mgmt_rpc_notify] 0-glusterfsd-mgmt: Exhausted all volfile servers
[2014-07-10 05:51:49.776284] W [glusterfsd.c:1095:cleanup_and_exit] (-->/usr/lib/x86_64-linux-gnu/libgfrpc.so.0(rpc_transport_notify+0x23) [0x7f6718bf3f83] (-->/usr/lib/x86_64-linux-gnu/libgfrpc.so.0(rpc_clnt_notify+0x90) [0x7f6718bf7da0] (-->/usr/sbin/glusterfs(+0xcf13) [0x7f67192bbf13]))) 0-: received signum (1), shutting down
[2014-07-10 05:51:49.776314] I [fuse-bridge.c:5475:fini] 0-fuse: Unmounting '/var/www/shared/public/uploads'.
该卷的状态为:
Volume Name: public_uploads
Type: Distribute
Volume ID: 52aa6d85-f4ea-4c39-a2b3-d20d34ab5916
Status: Started
Number of Bricks: 1
Transport-type: tcp
Bricks:
Brick1: koraga.int.example.com:/var/lib/glusterfs/brick01/public_uploads
Options Reconfigured:
auth.allow: 127.0.0.1,192.168.134.227
client.ssl: off
server.ssl: off
nfs.disable: on
如果我mount -a
在启动后运行,则卷已正确安装:
koraga.int.example.com:/public_uploads on /var/www/shared/public/uploads type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
一些相关的日志文件显示了这一点:
/var/log/upstart/mounting-glusterfs-_var_www_shared_public_uploads.log
:
start: Job failed to start
/var/log/upstart/wait-for-state-mounting-glusterfs-_var_www_shared_public_uploadsstatic-network-up.log
:
status: Unknown job: static-network-up
start: Unknown job: static-network-up
但在我的测试服务器上,它显示完全相同,所以,我认为这不相关。
知道现在出了什么问题吗?
更新:我尝试将 WAIT_FOR 从 static-network-up 更改为 networking,但仍然不起作用,但启动时的所有 [fail] 消息都消失了。以下是这些条件下日志文件的内容:
/var/log/glusterfs/var-www-shared-public-uploads.log
包含:
wait-for-state stop/waiting
/var/log/upstart/wait-for-state-mounting-glusterfs-_var_www_shared_public_uploadsstatic-network-up.log
包含:
start: Job is already running: networking
/var/log/glusterfs/var-www-shared-public-uploads.log
包含:
[2014-07-11 17:19:38.000207] I [glusterfsd.c:1959:main] 0-/usr/sbin/glusterfs: Started running /usr/sbin/glusterfs version 3.5.1 (/usr/sbin/glusterfs --volfile-server=koraga.int.example.com --volfile-id=/public_uploads /var/www/shared/public/uploads)
[2014-07-11 17:19:38.029421] I [socket.c:3561:socket_init] 0-glusterfs: SSL support is NOT enabled
[2014-07-11 17:19:38.029450] I [socket.c:3576:socket_init] 0-glusterfs: using system polling thread
[2014-07-11 17:19:38.030288] E [socket.c:2161:socket_connect_finish] 0-glusterfs: connection to 192.168.134.227:24007 failed (Connection refused)
[2014-07-11 17:19:38.030331] E [glusterfsd-mgmt.c:1601:mgmt_rpc_notify] 0-glusterfsd-mgmt: failed to connect with remote-host: koraga.int.example.com (No data available)
[2014-07-11 17:19:38.030345] I [glusterfsd-mgmt.c:1607:mgmt_rpc_notify] 0-glusterfsd-mgmt: Exhausted all volfile servers
[2014-07-11 17:19:38.030984] W [glusterfsd.c:1095:cleanup_and_exit] (-->/usr/lib/x86_64-linux-gnu/libgfrpc.so.0(rpc_transport_notify+0x23) [0x7fd9495b7f83] (-->/usr/lib/x86_64-linux-gnu/libgfrpc.so.0(rpc_clnt_notify+0x90) [0x7fd9495bbda0] (-->/usr/sbin/glusterfs(+0xcf13) [0x7fd949c7ff13]))) 0-: received signum (1), shutting down
[2014-07-11 17:19:38.031013] I [fuse-bridge.c:5475:fini] 0-fuse: Unmounting '/var/www/shared/public/uploads'.
更新 2:我也在 upstart 文件中尝试了这个:
start on (started glusterfs-server and mounting TYPE=glusterfs)
但计算机无法启动(尚不知道原因)。
答案1
我设法通过结合这个帖子和这个帖子中的答案来完成这项工作:GlusterFS 无法在启动时挂载
按照@Dan Pisarski 编辑如下/etc/init/mounting-glusterfs.conf
:
exec start wait-for-state WAIT_FOR=networking WAITER=mounting-glusterfs-$MOUNTPOINT
按照@dialt0ne 的修改如下/etc/fstab
:
[serverip]:[vol] [mountpoint] glusterfs defaults,nobootwait,_netdev,backupvolfile-server=[backupserverip],direct-io-mode=disable 0 0
在 Ubuntu 14.04.2 LTS 上为我工作
答案2
我在 ubuntu 12.04 上的 AWS 上遇到了同样的问题。以下是一些对我有用的方法:
- 在 fstab 中添加更多获取尝试
这将允许您在网络不可用时重试 volfile 服务器。
- 在 fstab 中添加备份 volfile 服务器
如果主服务器由于某种原因关闭,这将允许您从另一个 gluster 服务器成员挂载文件系统。
- 添加
nobootwait
你的 fstab
这允许实例在未安装该文件系统时继续启动。
我的当前 fstab 中的一个示例条目是:
10.20.30.40:/fs1 /example glusterfs defaults,nobootwait,_netdev,backupvolfile-server=10.20.30.41,fetch-attempts=10 0 2
我还没有在 14.04 上测试过这个,但它在我的 12.04 实例上运行良好。
答案3
这是一个错误
这确实是一个错误(static-network-up 不是一项工作,它是一个事件信号)。
此外,使用其他答案中建议的网络作业并不是最正确的解决方案。
所以我创建了这个错误报告并提交了针对该问题的补丁。
作为一种解决方法,您可以应用我提出的解决方案(在此答案的末尾)并_netdev
在您的 fstab 中使用该选项。
上面也显示了更好的解释,但是如果您愿意,可以跳过此解释。
解释
这是 中的一个错误mounting-glusterfs.conf
。它会在 Ubuntu 服务器的启动过程中增加不必要的 30 秒,甚至会挂起启动过程。
由于这个错误,mountall 进程认为挂载失败(您将在 中看到“挂载失败”错误/var/log/boot.log
)。因此,当不使用中的nobootwait
/标志时,该错误可能会挂起挂载进程(以及启动进程)。当使用/标志时,该错误将使启动时间增加约 30 秒。nofail
/etc/fstab
nobootwait
nofail
该错误是由以下错误引起的:
- 无需等待网络恢复。Ubuntu 本身具有
_netdev
挂载标志,每次接口启动时都会重试挂载; - 但是,需要等待 GlusterFS Server 守护进程(使用 localhost 进行挂载);
- 这是在一个旧提交在 GlusterFS 上游项目中。但是,此提交已被覆盖;
- 使用
wait-for-state
upstart 任务来等待信号是错误的。它用来等待作业。static-network-up
是一个事件信号,而不是作业;- 这就是为什么记录“未知作业:静态网络启动”的原因;
- 这是错误的,当等待一项工作开始时,没有传递
WAIT_STATE=running
环境变量,因为它不是默认值wait-for-state
。
解决方案
/etc/init/mounting-glusterfs.conf
:
author "Louis Zuckerman <[email protected]>"
description "Block the mounting event for glusterfs filesystems until the glusterfs-server is running"
instance $MOUNTPOINT
start on mounting TYPE=glusterfs
task
script
if status glusterfs-server; then
start wait-for-state WAIT_FOR=glusterfs-server WAIT_STATE=running \
WAITER=mounting-glusterfs-$MOUNTPOINT
fi
end script
附言:也使用_netdev
fstab 中的选项。
答案4
感谢您的详细解释,我想我比以前理解得更多了。最新的解决方案几乎可以正常工作。问题(实际上只有一个,因为第一个问题意味着第二个问题):
- 本地共享(
127.0.0.1:/share
)仍未安装 mounted TYPE=glusterfs
TYPE=glusterfs
永远不会满足,因此依赖于已安装状态的服务
/etc/fstab
:
127.0.0.1:/control-share /mnt/glu-control-share glusterfs defaults,_netdev 0 0
/etc/init/mounting-glusterfs.conf
:从上面复制而来
/etc/init/salt-master.conf
:
description "Salt Master"
start on (mounted TYPE=glusterfs
and runlevel [2345])
stop on runlevel [!2345]
limit nofile 100000 100000
...
本地共享必须手动安装,或者通过某种自动化方式,所有重启后都必须手动启动 salt-master。
后来注意到:mounting-glusterfs... 中的上述 WAIT 脚本阻止了整个启动过程,似乎 glusterfs-server 状态从未达到运行状态。