再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)+ b$ Y+ r! @3 F. Y3 e
$ @" T/ b- a/ \' |; y
本文章实用性说明
! g, j" C* P) z8 m, [ 1.检测Linux服务器的磁盘文件大小;: x% r* ]2 E- C+ G5 i: B$ u
2.重点清理项目;
! t. t+ j; W( @7 A
7 o6 i: D* A( Q% l) w* i 实用命令$ F* j/ C% z N: z4 H
0.查看硬盘剩余空间
( t6 u6 U9 a) }1 h+ @5 G
) c+ i4 }$ |& Q% l $ df -h #查看当前硬盘剩余空间并以GB单位表示: n& G l6 `4 a* j* c- Z7 t
文件系统 容量 已用 可用 已用% 挂载点) C; w4 }# Z+ a7 \$ L
udev 448M 4.0K 448M 1% /dev n4 ]6 k6 G6 d2 [- e1 c
tmpfs 99M 1.1M 98M 2% /run
1 S* t7 c) g7 D' Z /dev/sda 25G 13G 9.9G 57% /
5 E3 g1 N0 O9 C) N3 }- Z# X tmpfs 491M 0 491M 0% /dev/shm4 Z5 {9 F' C. s% y) x W
tmpfs 5.0M 0 5.0M 0% /run/lock
3 B5 h3 f/ K0 @ g& G tmpfs 491M 0 491M 0% /sys/fs/cgroup! q3 C- d: V+ z% X9 ~# g8 w$ E6 }
tmpfs 99M 0 99M 0% /run/user/0; _, [0 h) _* m5 D" m
1.查找大文件
5 r+ B3 D b! B1 Q4 M 1 ~" n6 w3 I* `
find . -type f -size +100M #查找当前目录100M以上的文件* O+ w4 h1 v! x0 E7 I1 y5 ]% P
2.对查找结果按照文件大小做一个排序) X5 ~! |" `+ O* N; ~# l+ n- C
: P. I7 E+ I9 N4 N1 R/ n V
find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr
% x+ H( U8 d R' u) t 2.1查看当前目录下某个类型的文件或数量
2 J$ R9 d6 k& U# @ |! g/ d* r! `4 _ ( n7 |) \' ^: B5 i2 V2 V3 @
find . -type f -print | grep php4 O u" S$ ~5 T, c0 q1 @
find . -type f -print | grep php | wc -l
5 ~' `3 y2 u6 {5 |3 k9 z" |- x5 B 3.查找当前目录下前20的大目录2 k: |" c) M8 w) T5 _+ [
. m! `0 w2 D; t3 B; n; n( N- @ du -hm --max-depth=2 | sort -nr | head -20% t' y- S5 h) c* q! A7 F/ [
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;1 r+ k8 j. \$ I2 I5 O# I
* s* u; N. Y! ?, |' Q! G 4.计算当前目录下所有图片大小,单位为MB;
9 I' Z7 Z: J/ b$ O' |
# z! I; M& c( D/ _2 }" P1 q/ W1 c/ q du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'4 h d! w- _5 E" e5 f
重点清理项目
$ G# q$ V% }& G7 r$ M! O: P Mysql 日志1 I e* B' O7 Z* ^9 A2 B$ a
手动清理日志文件' m# b9 C" V4 Q& p# b
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
' f. n5 k7 l: Z / ]4 z$ {0 B$ s# F
1.登陆进入mysql,并使用 show binary logs; 查看日志文件。% y! j* w! ?% v
' L2 X B5 ~# W
root@localhost:/home/# mysql -u root -p
# f2 Y2 P" N. T. n D( w Enter password: #输入数据库密码
% ` R3 s% ~* a3 W# v8 o mysql> show binary logs;
9 B5 n$ O, E1 [: I +------------------+-----------+. ^) c& Y/ k* o- w6 u
| Log_name | File_size |
1 R6 r% K! q/ h5 R3 \9 w% C+ ` +------------------+-----------+
1 j( ]6 u- z& n; ?5 ` | mysql-bin.001368 | 3175578 |
( B& L$ Z' ^- O6 _ x2 i( P. ? | mysql-bin.001369 | 177599 |' Y% H9 ~2 @. s1 v9 r; O
+------------------+-----------+
- t; }& i" N0 A! V6 _# w8 q 2 rows in set (0.00 sec)
- `: g3 h9 I( w' [8 B% t/ f 2.查看正在使用的日志文件:show master status;% O4 Z. I, l. z5 n. j1 J+ ^! z2 `9 w
5 `" @) Q& _2 d6 j7 h' W7 I mysql> show master status;
) z/ ~" R/ w' H8 G +------------------+----------+--------------+------------------+- k4 |, E; Y4 l, S% G+ Z
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |3 a" [/ l. d" R) S# a
+------------------+----------+--------------+------------------+
9 P$ f) m- A9 y P | mysql-bin.001369 | 348563 | | |. j3 D1 q4 A' G
+------------------+----------+--------------+------------------+5 h& l9 b6 G: K' b4 \; O3 z
1 row in set (0.00 sec)# k5 c8 |) c/ a( G
如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;( U, k/ I# c: x. M5 t
+ v# v' M! F# V) l) @: e' E3 l
3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';, J) g1 B; ^1 @% n) `
) e q0 G' k* K+ ^7 K ^8 U
mysql> purge binary logs to 'mysql-bin.001369';
# n6 |; \& q% \: E, M Query OK, 0 rows affected (0.02 sec)& q, x- D" I/ w
mysql> show binary logs;
% w$ {' t" [1 j8 s" y +------------------+-----------+, P1 m P$ q4 J
| Log_name | File_size |; g- }1 x8 q0 J' I( f* }; J
+------------------+-----------+
i8 S: M: g ~/ x$ m% `/ q* d | mysql-bin.001369 | 949552 |0 y7 z$ S: ]* R/ N2 M u1 m3 B
+------------------+-----------+
% U1 @3 u" I0 x; W) h- f3 l* v9 A 1 row in set (0.00 sec)
% M' Z) }' F5 Q1 t 删除完毕;7 @$ d& K& k2 A
$ M, G/ p. ], J; f0 s9 g2 R. \ 定时清理日志文件; y2 n: Z6 V$ E: Q! e
1.主理人自己已经设置其不产生日志;9 f1 N$ Z. ]& d& J
2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
: u, g# t e9 G
: o6 i9 J! G+ a mysql> exit+ W$ W1 f3 ]- |, K: X! e- D( y' ]
Bye
1 O3 n `& E$ I; t# R/ W root@localhost:/home/# vim /etc/my.cnf6 k' n* J9 s6 F; |8 Q
编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;6 ^7 z$ b$ D! A3 ~6 A/ A
$ @+ Y3 w2 [6 H, |" Q4 I
log-bin=mysql-bin
3 _( g# y$ M/ U4 r8 k% n, a0 ` binlog_format=mixed/ B! z6 i) H/ f/ s
server-id = 1( j. I1 T( K( b2 B! P- O
expire_logs_days = 10
- i% o+ z3 y7 p8 K) Z$ U 改好,保存;重启 MySQL 即可;- `' Z/ {6 t. Z7 N- ]5 \/ ?, s7 I
+ `" }4 o0 n( ]. R root@localhost:/home/# lnmp mysql restart
) A. I7 |# o# r: A, ]$ R! ^$ I! [8 h 或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;) }, I$ w% R4 g5 d" }
# U8 }, T& e% X# R( P
##注释 log-bin=mysql-bin" N; D i" }! O' B) \5 w$ a3 ?
##注释 binlog_format=mixed
) y# A; E \& j- z5 j& x 参考1:Mysql 日志爆满,删除日志文件,定时清理日志4 b; m( {- A( R2 t! p5 Z o% r
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录# \- u3 a7 }$ V. R
2 \8 o- `! ~+ a; w Nginx 日志
0 n9 o# |+ X, G A% d) a% i& f 手动清理日志文件
+ d2 J/ m' R5 t4 J8 J nginx log;/ N" M: }+ b$ N! Q+ j9 @
以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
" q4 Q6 [% @- m6 y; i - Z4 ]0 W4 I& w
找到相关日志,直接使用命令 ls 查看有多少日志;( Y1 A6 T2 J9 N" v# k
, }, A; x" n; b, H* t3 o
root@localhost:/home/wwwlogs# ls
5 R) T* K# m, o; m nginx_error.log
* I! g( o3 J. `. L5 I GeoLiteCity.dat limbopro.com.log ! G4 ^- L1 x0 W/ \- C% q* U& D' s
access.log
r T4 s9 I% E( e 使用 > + 文件名 清理日志文件;
3 d! u. \8 F' Y9 u" G$ G$ F0 V ! l! x0 ^, j% J6 o5 l+ m1 k0 t1 V
root@localhost:/home/wwwlogs# > limbopro.com.log
* D m6 N) r! o/ y/ z8 ?9 {2 V+ y: J% ` root@localhost:/home/wwwlogs# > access.log
) t1 ?$ I( q1 X( c2 o* C2 k ^7 W 定时清理日志文件
" U9 E+ e5 A( P) c2 k& X( h) o 使用 crontab 定时清理日志文件;" Z* b& t5 r3 @, r6 J3 g7 i5 Y, |9 b
# A0 P" d4 }; \ root@localhost:/home/wwwlogs# crontab -e
. N1 ?/ l. F" t3 u$ Z3 J4 s 添加一条,设置每日凌晨零点自动清空日志: f1 w _& l3 a
) O, c: p) o' z" L- }" H9 a4 \; K 0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志
" x; |3 t( ]6 l5 B0 E1 e 0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志1 M3 k8 ?$ x0 R$ y" p- J2 f
保存,退出,重启 Crontab;
! q2 o1 [4 e+ x7 a
) v/ I9 h8 ~3 g" u+ r root@localhost:/home/wwwlogs# service cron restart
4 x* f# g+ N/ E* `% A root@localhost:/home/wwwlogs# service cron reload
) j# b% o+ d. z7 d* s d: } *日志文件具体位置,以实际为准;本方法比较粗暴;
8 f; T% M7 ?* F$ a. s) z! r # x6 T3 Z; Y# E8 Z f, i
参考1:Linux crontab命令及其用法;
/ ~8 y% U, |7 I2 P0 y1 K- n9 Q& b & C3 m# d8 A% p; ?7 z
journalctl 日志清理( I) z5 F6 u3 N% o. O$ a% Y
配置文件路径: /etc/systemd/journald.conf;
; p' m$ |5 `- F O 日志存放文件夹:/var/log/journal;" h6 ^1 Z2 E, i8 \0 C, N
" t; G+ y* v$ {
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。+ _. z+ P! ^! r" f7 q" \
, @1 }2 s! z# ?
清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:) _% O. \. A: J, v/ D" a
% i- J4 |& e8 \ journalctl --vacuum-size=20M }7 b" j% S3 _
系统日志清理7 e1 @. C6 y/ F
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。- o0 V0 B* H0 z0 g+ ?) N3 n
4 a. {+ v' @# F. E1 c x
sudo apt-get install ncdu" K. B9 `- n8 y8 a
sudo ncdu /var/log #然后按i键
. R5 a1 c# \& Z% B+ | ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help
9 l a* a7 [5 B) Y5 Z --- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------; \1 I4 @3 e) A
48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ % i/ X8 x6 g! Y+ Y. y
16.9 MiB [### ] auth.log │ │& b5 z! P- a/ R- T4 b; _0 q" H
15.0 MiB [### ] redis_6379.log 0 V0 W- ?! D: S% ^+ M6 {7 {3 f, W
..." }9 N" a& v2 N9 R p; _( p
然后进入 /var/log/' g8 d- i2 t& M6 B
" a6 d# e' t( U* Z' a5 k cd /var/log/
3 k: P. [7 v3 w9 z, g B > redis_6379.log; `3 W8 A! i- J9 F0 [. j
安装包清理
( F- Q9 k6 E0 M% T" t+ y 查看安装包缓存大小
9 q u* T, Z* L# s : J3 o3 Y: O, t$ B( l, k4 B0 \
du -sh /var/cache/apt/archives( T3 Y/ z4 M6 d4 g \2 m9 E
使用如下命令删除已经安装过的deb包3 J; B9 _+ M5 P. X4 i( Z2 }' n
( i) [3 N! @9 u5 |4 Q; |" N
sudo apt-get clean
V6 O2 P4 h9 H7 F sudo apt-get autoclean) A6 v+ r- g7 J: z- Z
删除孤儿软件包 已经没有用处的依赖: F% @! s8 A7 U( M/ Y' S
6 K5 w- `- Z3 G; A6 K/ }, w! Y0 U
sudo apt-get autoremove
( W- W5 t+ l( }7 ]3 h 清除手动安装的依赖包1 {8 s \; N% @0 E [
5 h' y0 W0 p7 @# T
deborphan
8 W9 ~0 e1 l9 `. W sudo apt-get install deborphan# c: _0 S1 y) S ]1 J, e
deborphan | xargs sudo apt-get purge -y
* y. x2 J& V. w$ W2 A6 t+ a j! H, l' ~ 删除大容量已安装软件包
. m$ h, E) I. N. S: V 首先安装debian-goodies, K# _* x+ j& p$ D7 ]- ]5 _
, C! D4 e- F9 j; ~# e1 [ sudo apt-get install debian-goodies
4 |( Y; c A( _ 然后输入下面的命令
& t& \& w! ^) x9 ], V# R , e. |- g: F/ H* E. O
dpigs -H0 B- ^. l0 \2 [, q3 L% i7 n4 L
我的输出结果
5 I7 B1 k/ U6 U5 T* M2 l % |& L" j1 J# E, w! M {
531.3M linux-firmware0 ?" I+ B( |4 c1 O1 M0 s8 b1 w
315.0M fonts-noto-extra
8 y: M+ H' L: G6 I) l8 B* ^$ F 282.0M libgl1-mesa-dri
/ P" j7 ~% u r5 k# O. L/ ?0 D 214.7M golang-1.13-go6 z3 r' t6 O" N) a
212.9M linux-image-4.11.8-041108-generic
! f$ Y) {) c. w4 ^3 l: X# D( Q 181.1M linux-modules-extra-5.4.0-60-generic8 I! E8 n( X8 [9 v
181.1M linux-modules-extra-5.4.0-59-generic
. g5 w$ w7 F0 g5 u' B% P* \! w 181.1M linux-modules-extra-5.4.0-58-generic
5 G7 s7 r7 |! l/ k5 S! H5 ^! z 166.2M docker-ce-cli. P$ K5 l; d" o" _& L; i: V w x* E
123.3M containerd.io2 a2 u% a# b/ ]' z$ Y/ r
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个% U) ]; z' w3 _( x
% X6 f0 X+ l* l 注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;3 u# ~: s" K4 M: v: f, E
dpigs -H --lines=20
; j7 G S8 C2 B0 f 软件包卸载命令
Q2 a/ m( t: r, c3 Z- y# E & B O# P3 D1 n1 t
apt-get purge #purge 后面接软件包名称
; d' Q, ~6 e# r) T# S$ y% w apt-get --purge remove #配置文件也清理掉 命令后面接软件包名称
. ^, D3 S0 h: }: S$ o 示范 以 删除 golang-1.13-go 软件包举例;- F9 J" J4 `1 S' `3 p
$ ?, r- U5 T1 o$ w0 U' O, X v
root@localhost:~# apt-get purge golang-1.13-go
5 D+ _. e3 N8 D6 C0 C P 正在读取软件包列表... 完成! Z3 a1 }+ ]& X3 |
正在分析软件包的依赖关系树 9 _) u7 P4 ~- p0 d: \
正在读取状态信息... 完成
+ |& K" P7 ?. O7 ]' o. A7 v5 a 下列软件包是自动安装的并且现在不需要了:
4 |. C* v$ W, P# C. b golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src
. C5 o; G4 @# Y9 \ _2 h S 使用'apt autoremove'来卸载它(它们)。; J/ ~7 u _ |6 ~8 q5 }' W% g9 ?4 Q
下列软件包将被【卸载】:# [% T& o8 H1 w4 z$ d! X2 }
golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*1 n$ S6 h) a I6 n9 Z1 w% \2 g
升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。
8 L# L- l2 V; F2 |# D( r 解压缩后将会空出 230 MB 的空间。
! G" \* M6 V2 j2 H1 P 您希望继续执行吗? [Y/n] Y# v; ^+ G% x) ~6 u! X X8 \. d
旧的内核清理
* u5 v3 V4 C2 X; ], ^ 查看当前使用的内核
+ v2 t8 X+ r$ f0 y) F ) W. J) e5 O8 q0 ~1 k2 C# H
$uname -r& K( V/ S3 V# R Y' m+ y
5.4.0-60-generic
, L/ W E# s, R9 c# r" w1 s $dpigs -H --lines=20) V$ p! G" t$ B v& r
74.1M linux-headers-4.14.91-bbrplus3 Z2 D1 N. v1 g, l" F! l
70.0M linux-modules-5.4.0-60-generic //保留
8 t. {* T/ M9 |" X7 y 70.0M linux-modules-5.4.0-59-generic //保留
$ k* _7 e# R7 d& M ..., V% S/ Q. z% u" N% z
看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);8 W7 o- e+ _: S: W- v' [. j
5 M! _, a) g$ Z& O" m& z: V $apt purge linux-headers-4.14.91-bbrplus5 w0 ^: B) b; e# S# m) m
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):
# b& F' h. m$ B' { 9 J1 C$ Q9 H% U2 D. _# y6 t6 |; A
$update-grub& M2 J; p1 `( f* o& {
Sourcing file `/etc/default/grub'4 o" ~4 a5 t+ d0 R& @) r+ L, W7 G% Z
Sourcing file `/etc/default/grub.d/init-select.cfg'! y1 g2 G0 d, X. E5 ?: p
正在生成 grub 配置文件 ...
, e! O( v) i# e+ } 找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在 " _ h4 e$ h! l- O h, W
找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic
' ]8 r* J3 G2 {3 z 找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic
( [' l" Y: ^. a1 A( [1 I 找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
: A' l3 m1 _" E" ~/ b' ] 找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
R1 c6 B/ O q. Y 找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic& `% F0 i4 z& _; f: e( @
完成, F7 @7 ~/ U8 x" ~8 i# I
...- x) ~. v$ p/ k! H' y
; X! D" Q( q+ H! N: S5 m" X 相关知识
5 e1 D, v: E( q$ ^ LINUX的磁盘管理du命令详解8 | D; a4 G& ]9 s# g1 o o
( R" D) b V0 T1 N du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
- g/ U4 L/ B% Y3 b; @ 4 k4 U% V! n0 } J8 ^
DU命令用途
6 e' K6 F2 m, n du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。3 m) }7 o, r. E4 s' d* G
$ x* d, x9 [1 D3 x 找出大文件
! |* a- M7 m! N z+ A: [7 U Z 磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
( z; `; \! ^% ?8 F0 D# u- f & y! {; Y4 c7 ^) z1 k
du -s /home/* | sort -nr #/home目录检测
- s; I) h1 a6 o$ |" f
) w! o0 f2 k$ f2 C0 p