那阵子我刚开始把客户机子接进我们自己的七亿批量远程管理工具,一台宝塔面板的论坛服务器也在列表里。那天晚上九点四十,客户先甩来一句「注意有数据别把我数据删了」,后面才跟一句「磁盘挂载掉了你帮我挂回去」。
这开头其实就把调子定了——真要是盘坏了,是一套救数据的打法;要是挂载配置的问题,是另一套打法。当时我没分清,第一步就没走快。
先说结果:/www 挂没了,MySQL、nginx、php-fpm 跟着一串停,宝塔面板打不开,站点直接连不上。前后四十来条命令,/www 挂回来,站点 301 → /bbs → 200。真凶就一行 fstab。
我连着 SSH 终端看盘,第一反应跟客户一样:盘是不是坏了。先看盘还在不在。lsblk -f 敲下去,sda、sdb 都在:sda1 是 50G 的 ext4,sdb1 只有 1M。就是这个 1M 让我停住了——1M 的分区基本都是 BIOS boot,压根没有文件系统,拿它当数据盘挂不上是必然的。
再 cat /etc/fstab,第 11 行写得整整齐齐:
/dev/sdb1 /www ext4 defaults 0 0挂载点对、文件系统对,只有设备名写成了 sdb1。
这个坑踩过一次就记住了:fstab 里写设备名(sda、sdb 这种)不稳,插拔盘、内核枚举顺序一变,sda 和 sdb 就可能对调,写死 sdb1 早晚出事。稳妥写法是写 UUID——用 blkid 把那个 50G 分区的 UUID 拿出来填进去。这台机器当初图省事写了设备名,正好撞上顺序变了。
改这种关键配置,我一般在七亿批量远程管理工具里开着终端逐条敲,先 cp -a /etc/fstab /etc/fstab.bak 备一份,才动手把设备名换成对应 UUID。改完没急着往下走,先 mount /www、findmnt、df 回读一遍,确认是 rw 挂上、数据目录齐全。挂载这种东西,改完必须回读,不回读等于没改。
顺便说个后来才弄明白的:systemctl is-active mysql 当时报的是 active,看着数据库好好的,可 ps 里没有 mysqld,socket 也不在。原因是那会儿 /www 还没挂上,MySQL 的启动脚本里 my_print_defaults: command not found,PATH 也是缺的。判断一个服务到底起没起,得看进程、socket、端口三样,不能只信 is-active。
/www 挂回来以后,MySQL 还是起不来(datadir=/www/server/data 之前不在)。我没在面板上折腾,直接 /www/server/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql 把它拉起来,盯着真实 err 日志看有没有报错。nginx 那边反倒省事:它 21:32 开机自启失败,是因为那会儿配置全在没挂上的盘里,盘一回,nginx -t 直接过,start 就活。这种「服务坏了」其实是被上游故障带停的,不用修。
最后卡在 502:80 通了但页面 502。宝塔的 PHP 是多版本的(55/71/85 三套),得从站点的 vhost conf 里翻那句 include enable-php-85.conf 才知道用的是 85,然后起对应的 php-fpm。301 → /bbs → 200,收工。
对了,之前有篇讲服务器突然只能读不能写的,也是这类「盘看着没事、配置在闹」的账;磁盘上的毛病,不少是配置在闹,不是硬盘本身的锅。
回头看,这事最不值钱也最值钱的地方都在那行 sdb1:不是什么玄学故障,就是当初写配置时少打了一个字符。
写完这段我顺手翻了下自己手上别的机器,还有两台的 fstab 是老写法。回头得改。
顺带提一句,前面连机器用的那套是开源的——七亿批量远程管理工具,Windows 端免费,RDP 九宫格、SSH 终端、SFTP、FTP 都有。机器是在七亿网络租的韩国节点,跑论坛够用;要云主机、服务器的可以顺便看看。
评论