IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件。但是发现删除该文件后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢??
[root@linux]# df -hFilesystem

在Linux系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),也就是说只是删除了文件和系统目录结构的链接;如果文件在删除时是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程将仍然可以读取该文件,也就是说没有删除掉文件在读取的状态,所以磁盘空间也就会一直被占用。
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没释放,就是因为有进程还在一直向这个文件写入内容,导致虽然删除了文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。
1.通过lsof|grep deleted命令获取到已经被删除但是仍然被应用程序占用的文件列表,然后kill掉还在占用所删除文件的进程。需要注意的是:如果有很多进程都在使用所删除文件,那么采用第1种方式kill进程就有点麻烦了,而且风险也比较大。因为kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。必须要确定不会对运行中的进程造成影响时才能使用,应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。

杀掉filebeat进程后磁盘空间恢复
2,或停掉或重启使用这个所删除文件的应用,让OS自动回收磁盘空间。
3,也可以重启操作系统,不过这并不是最好的方法
4,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件。通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。
在线清空文件(比如/home/111.log)的方式:
a)# echo " " > /home/111.log
b)# cat /dev/null > /home/111.log
c)# > /home/111.log
还有一种磁盘空间使用问题的现象:明明使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满:” no space left on device”!
一般这种问题都是由于分区目录下deleted删除后的资源空间没有真正释放出来导致的, 具体处理流程如下:
1.先df -lh查看一下磁盘使用状况, 发现/data分区下的Used已用空间很大, 但是实际查看并没有占用那么大的空间!
2.找到被删除文件所在的分区, 比如/data分区
3.查看被删除了的所有文件:lsof -n /data |grep deleted
4.杀死这些文件的delete进程, 释放空间: lsof -n /data |grep deleted|awk ‘{print $2}’|xargs kill -9
5.接着再运行lsof -n /data |grep delete,应该就没有结果了。
6.注意: 刚杀死deleted进程时, df -h查看/data 分区, Used已用空间可能时瞬间显示过大, 但随着deleted进程杀死, 资源逐渐释放, /data分区下的Used已用空间会逐渐变小, Avail可用空间会逐渐变大)
大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监控系统和管理员一点时间去察觉。不过有时候这部分预留的硬盘空间不用的话有点浪费。
在Linux系统中,ext2、ext3、ext4文件系统上通常会默认预留5%的磁盘空间,比如磁盘如果是2TB,这就意味着有100GB的空间会被预留下来,这样的话会不会显得有点浪费了。可以通过”tune2fs”命令来改变5%的默认设置,比如只预留2%的空间。但是不建议设成0%,现实环境中这样做不安全。
Linux 查看端口占用情况可以使用 lsof 和 netstat 命令。
lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 查看端口占用语法格式:
lsof -i:端口号
查看服务器 8000 端口的占用情况:
# lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nodejs 26993 root 10u IPv4 37999514 0t0 TCP *:8000 (LISTEN)
可以看到 8000 端口已经被轻 nodejs 服务占用。
lsof -i 需要 root 用户的权限来执行,如下图:

更多 lsof 的命令如下:
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof d /usr/local/:显示目录下被进程开启的文件
lsof D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件
netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。
netstat 查看端口占用语法格式:
netstat -tunlp | grep 端口号
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
例如查看 8000 端口的情况,使用以下命令:
# netstat -tunlp | grep 8000
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 26993/nodejs
更多命令:
netstat -ntlp //查看当前所有tcp端口
netstat -ntulp | grep 80 //查看所有80端口使用情况
netstat -ntulp | grep 3306 //查看所有3306端口使用情况
在查到端口占用的进程后,如果你要杀掉对应的进程可以使用 kill 命令:
kill -9 PID
如上实例,我们看到 8000 端口对应的 PID 为 26993,使用以下命令杀死进程:
kill -9 26993
1.光通路诊断面板


提醒按钮:该按钮将前面板上的系统错误指示灯置为提醒方式。在提醒方式下,系统错误指示灯每 2 秒闪烁一次,直至问题得到纠正、系统重新启动或发生新的问题。通过将系统错误指示灯置为提醒方式,可确认您已知道发生的上一个故障,但暂时不立即采取措施来纠正问题。提醒功能由 IMM 控制。
NMI按钮:按下该按钮以强制微处理器发生不可屏蔽中断。它允许您使服务器出现蓝屏并进行内存转储(仅当由 IBM 服务支持人员指导时,才可使用该按钮)。
检查点代码屏幕:该屏幕提供检查点代码,表明系统在引导块和 POST 期间会在该点停止。检查点代码是由 UEFI 生成的字节值或字值。该屏幕不提供错误代码或建议要更换的组件。
复位按钮:按下该按钮可重置服务器并运行开机自检(POST)。您可能需要使用笔尖或拉直的回形针的末端来按该按钮。复位按钮位于光通路诊断面板的右下角。
over spec指示灯:当此指示灯发亮时,表明对电源的需求超过了指定的电源供应。
log指示灯:当此指示灯发亮时,表明事件日志有报错,应该查看事件日志。
link指示灯:当此指示灯发亮时,网卡出现故障。
ps指示灯:当此指示灯发亮时,表明电源出现故障。
pci指示灯:当此指示灯发亮时,表明某个pci 总线发生错误。
sp指示灯:当此指示灯发亮时,表明流处理器遇到错误(sp的作用就是处理由CPU传输过来的数据,处理后转化为显示器可以辨识的数字信号)
fan:当此指示灯点亮时,表明散热风扇或电源风扇出现故障或运行太慢。风扇发生故障还会导致temp 指示灯发亮。
temp 指示灯:当此指示灯发亮时,表明系统温度超出过高。
mem 指示灯:当此指示灯发亮时,表明发生内存错误。
nmi 指示灯:当此指示灯发亮时,表明出现一个不可屏蔽中断(nmi)。
cnfg指示灯:当此指示灯发亮时,表明BIOS配置错误。
cpu 指示灯:当此指示灯发亮时,表明某个微处理器出现故障。
vrm 指示灯:当此指示灯发亮时,表明微处理器托盘上的某个vrm 出现故障。
dasd 指示灯:当此指示灯发亮时,表明某个热插拔硬盘驱动器出现故障。
raid 指示灯:当此指示灯发亮时,表明阵列卡故障。
brd 指示灯:当此指示灯发亮时,表明某个连接的i/o 扩展单元出现故障。
2.操作员信息面板

电源控制按钮外盖:将此外盖滑动到电源控制按钮上方可防止服务器被意外关闭。
电源控制按钮:按下该按钮可手动开启和关闭服务器。
供电指示灯: 如果该指示灯点亮并且不闪烁,表示服务器已开启;如果该指示灯闪烁,表示服务器已关闭并且仍然连接到交流电源;如果该指示灯熄灭,表示没有交流电源或者电源或指示灯本身出现故障。注:如果该指示灯熄灭,并不表示服务器中没有电源。该指示灯可能已烧毁。要切断服务器的所有电源,必须从电源插座中拔出电源线。
以太网图标指示灯:此指示灯可点亮以太网图标。
以太网活动指示灯:如果这些指示灯闪烁,表示在它们指示的端口处存在服务器和网络之间的活动。
定位器指示灯:使用该指示灯可以用肉眼在众多服务器中找到目标服务器。可以使用IBM Director 远程点亮该指示灯,也可以按下定位器按钮手动点亮该指示灯。在启动期间该指示灯也会点亮。在多节点配置中,如果该指示灯闪烁,表示与它对应的服务器是主节点。如果该指示灯持续点亮,表示与它对应的服务器是辅节点。
定位器按钮:按此按钮可以手动打开或关闭定位器指示灯。 在多节点配置中,按该按钮可以打开或关闭配置中所有节点的定位器指示灯。
信息指示灯:如果该指示灯点亮,表示服务器中有某个方面未达到最佳状态,同时光通路诊断会亮起另外一个指示灯,以帮助找出问题。只有在解决了此问题或按了提醒按钮后,该指示灯和光通路诊断面板上的指示灯才会熄灭。
系统错误指示灯:如果该指示灯点亮,表示发生了系统错误。光通路诊断面板上的一个指示灯也会点亮,以帮助找出此错误。
1.服务器启动的过程中按“F10”intelligent provisioning进入智能配置

2.在配置界面点击选择Smart Array P420i,右边执行动作选择Configure

3.选择Unassigned Drives未分配的驱动器,选择要制作的硬盘,然后点击创建。

4.此处以制作raid0为例。如下图,点击创建

5.点击YES,确定继续。

6.右上角点击刷新。

7.可以看到多了一个logical Devices。

1.这不是一个专业的测试工具,不过如果对于测试结果的要求不是很苛刻的话,平时可以使用来对磁盘的读写速度作一个简单的评估.另外由于这是一个免费软件,基本上linux系统上都有安装。
2.DD命令常用参数有
bs=n,block size,每次读取 n bytes 写入,可与 count 联用;
ibs=n,一次读入 bytes 个字节 (default is 512);
obs=n,一次性写 n bytes 个字节 (default is 512);
bs 可以同时设置上边两个参数;
cbs=n,一次转换 n 个 bytes,即转换缓冲区大小。;
count=n, bs 操作的次数,仅拷贝 n 个块,如 dvd: bs=1M count=4430;
skip=n,指 if 后面的原文件跳过 n bytes 再开始读取;
seek=n,指 of 后面的目标文件跳过 n bytes 再开始写入;
3.首先了解两个特殊设备
/dev/null 伪设备,回收站.写该文件不会产生IO
/dev/zero 伪设备,会产生空字符流,对它不会产生IO
1.测试方法:
a.测试磁盘的IO写速度
time dd if=/dev/zero of=test.dbf bs=8k count=300000
如果要测试实际速度 还要在末尾加上 oflag=direct测到的才是真实的IO速度

b.测试磁盘的IO读速度
dd if=test.dbf bs=8k count=300000 of=/dev/null
表示 每次写入/读取8k的数据,执行300000次

c.测试IO同时读和写的速度
time dd if=/dev/sda1 of=test.dbf bs=8k count=300000
同时测试读写速度时生成一个 test.dbf文件

所有测试的数据量较小,仅作为参考。
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
runoob@runoob:~# docker

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
runoob@runoob:~# docker stats --help

容器使用
获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
$ docker pull ubuntu
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
$ docker run -it ubuntu /bin/bash

参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
root@ed09e4490c57:/# exit

启动已停止运行的容器
查看所有的容器命令如下:
$ docker ps -a
点击图片查看大图:
使用 docker start 启动一个已停止的容器:
$ docker start b750bbbcfd88

后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
点击图片查看大图:
![]()
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)。
停止一个容器
停止容器的命令如下:
$ docker stop <容器 ID>

停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>

进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach 命令
下面演示了使用 docker attach 命令。
$ docker attach 1e560fca3906
注意: 如果从这个容器退出,会导致容器的停止。
exec 命令
下面演示了使用 docker exec 命令。
docker exec -it 243c32535da7 /bin/bash
注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。
更多参数说明请使用 docker exec --help 命令查看。
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
删除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906

下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune
运行一个 web 应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
runoob@runoob:~# docker pull training/webapp # 载入镜像
runoob@runoob:~# docker run -d -P training/webapp python app.py
![]()
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
查看 WEB 应用容器
使用 docker ps 来查看我们正在运行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
这里多了端口信息。
PORTS0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用

我们也可以通过 -p 参数来设置不一样的端口:
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在运行的容器
runoob@runoob:~# docker ps
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。
网络端口的快捷方式
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的 web 应用容器 ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar。
我可以使用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 来查看容器端口的映射情况。
runoob@runoob:~$ docker port bf08b7f2cd895000/tcp -> 0.0.0.0:5000
runoob@runoob:~$ docker port wizardly_chandrasekhar5000/tcp -> 0.0.0.0:5000
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
runoob@runoob:~$ docker logs -f bf08b7f2cd89
* Running on http://0.0.0.0:5000/ (Press CTRL C to quit)192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
runoob@runoob:~$ docker top wizardly_chandrasekhar
UID PID PPID ... TIME CMD
root 23245 23228 ... 00:00:00 python app.py
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
runoob@runoob:~$ docker inspect wizardly_chandrasekhar[
{
"Id": "bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85",
"Created": "2018-09-17T01:41:26.174228707Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 23245,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-09-17T01:41:26.494185806Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},......
停止 WEB 应用容器
runoob@runoob:~$ docker stop wizardly_chandrasekhar
wizardly_chandrasekhar
重启WEB应用容器
已经停止的容器,我们可以使用命令 docker start 来启动。
runoob@runoob:~$ docker start wizardly_chandrasekhar
wizardly_chandrasekhar
docker ps -l 查询最后一次创建的容器:
# docker ps -l
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
正在运行的容器,我们可以使用 docker restart 命令来重启。
移除WEB应用容器
我们可以使用 docker rm 命令来删除不需要的容器
runoob@runoob:~$ docker rm wizardly_chandrasekhar
wizardly_chandrasekhar
删除容器时,容器必须是停止状态,否则会报如下错误
runoob@runoob:~$ docker rm wizardly_chandrasekharError response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
1.如果硬盘出现告警,根据不同告警状态可以作初始判断和定位。硬盘指示灯状态定义参考如下图。


*参考文档:HP ProLiant DL380 G6 Server Maintenance and Service Guide--June 2009 (Fourth Edition)
1.在开机到下图界面时按F8,进入ipmi配置界面。

2.如下图,在菜单中找到 Network—NIC and TCP/IP 。

3.进入这个界面,在IP Address输入ipmi的地址例如192.168.169.81
Subnet Mask输入掩码:255.255.255.0
Gateway IP Address:192.168.169.1

4.IPMI地址配置完成之后,F10确定退出。
