|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)
( Q6 @1 q4 z/ ~/ F4 c# ]9 x" P- e4 [$ |) K
本文章实用性说明+ i. t% D2 w' L4 ~) }2 h" o& B
1.检测Linux服务器的磁盘文件大小;
4 q6 q2 v' `( f2.重点清理项目;
- G. k6 n i$ `9 ^0 q4 b/ O8 v# H. I. z% Q5 \' E
实用命令
0 j+ z- [5 `; G0 x0.查看硬盘剩余空间
* b- d0 `3 [) ~2 P, @$ B
' m& F( U2 F' e" L; R! \6 V1 I% a9 M$ df -h #查看当前硬盘剩余空间并以GB单位表示% ]0 z% f# ^3 D; i5 `
文件系统 容量 已用 可用 已用% 挂载点
E2 ~1 E; M: ?0 L6 Cudev 448M 4.0K 448M 1% /dev& Y' |7 i' q) d) Z, W8 E# D! j
tmpfs 99M 1.1M 98M 2% /run7 h+ f. {0 p1 ]3 d/ C9 G! c
/dev/sda 25G 13G 9.9G 57% /
0 m4 }9 t1 e( ~tmpfs 491M 0 491M 0% /dev/shm6 ~% }( ]1 [- t! q: y6 k
tmpfs 5.0M 0 5.0M 0% /run/lock
( C2 @- P# y0 }2 r! Ztmpfs 491M 0 491M 0% /sys/fs/cgroup! y8 l4 ]! S4 i9 x3 h5 {9 P
tmpfs 99M 0 99M 0% /run/user/0$ b1 S: d5 D$ P2 n# k5 s1 x7 h
1.查找大文件
, s+ C' @7 \- i
# f8 S4 W: r! m# w+ Z: h3 |find . -type f -size +100M #查找当前目录100M以上的文件 n* ]3 U; |# v
2.对查找结果按照文件大小做一个排序2 P |8 D2 U$ o& C$ M
; P) q5 Y- s1 Q
find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr
3 [0 C9 [2 X! |% K/ F% i: Q4 `2.1查看当前目录下某个类型的文件或数量
" C* T5 S/ P. ^; }# m( k8 Q1 W! I4 e% ^" l7 B
find . -type f -print | grep php2 y$ S! M( ?" E: ~6 z9 N* S
find . -type f -print | grep php | wc -l0 M: Y3 G& F5 U
3.查找当前目录下前20的大目录) J+ d. B' P# I+ s% X! O5 G
# C9 U* M( G8 ?) p1 |du -hm --max-depth=2 | sort -nr | head -20
{1 o5 K* @! A*这个命令我常用,先列出20来个大占用的文件夹,一一击破;
% t4 |) ?! G; ]$ v1 R2 u* ?
* }! i+ G9 J6 F4.计算当前目录下所有图片大小,单位为MB;. G. u0 n$ J4 O/ [( Q& k
5 v0 A* ?* F! Q) o5 X6 o5 }du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
7 d3 A) [5 ^: s' v8 l重点清理项目
) b; ^/ U$ ^% e2 c2 BMysql 日志
' j* _- Q, t b! J" A8 l, _( H/ h U手动清理日志文件
- t% z+ S1 u6 m# w( umysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
, r# F" x# ^; K- r
0 u7 k% H: l0 j) g; p' W. \3 U1.登陆进入mysql,并使用 show binary logs; 查看日志文件。
7 J& N- Y- X, f) k v
8 Q( J* |2 e. _* Yroot@localhost:/home/# mysql -u root -p
) a. @! [6 [9 XEnter password: #输入数据库密码& W R( q# F& [/ {0 x) s1 l. l3 `
mysql> show binary logs;
" D# W) P7 w6 c: r" c! u. S' x+------------------+-----------+
2 J& C! L/ d! w' \9 o1 a7 }$ f$ n| Log_name | File_size |
* e. w7 L4 s* ]. A, n( ]+------------------+-----------+
5 T* v. @3 t/ j* }+ S| mysql-bin.001368 | 3175578 |) m( P- v4 o, Z! o
| mysql-bin.001369 | 177599 |
3 [: @2 Y* H! |* H+------------------+-----------+7 `2 J$ }, D7 S2 ^# a }& S
2 rows in set (0.00 sec)
0 V# |# N. D: t7 @) u2.查看正在使用的日志文件:show master status;: w- y8 w" U( Q- m* |% M
9 S6 U, \% ?9 Z6 ^mysql> show master status;
! w2 H& e3 \" ]7 g8 K+------------------+----------+--------------+------------------+) |, J2 l0 C8 |; H
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
8 q; o' n+ z9 L3 [+------------------+----------+--------------+------------------+
$ Z2 ^3 L3 h; p. S2 R| mysql-bin.001369 | 348563 | | |
. a' {! D. M+ `% f. X% L" [7 S! i+------------------+----------+--------------+------------------+
: M1 E6 _3 P! x# k- o8 |9 v: {8 ]1 row in set (0.00 sec)' C! B/ [* {4 d0 n% k5 M2 S
如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;
( S8 _* \$ u G E9 ]3 ]! a o- ?# z5 F) u
3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';5 o7 @$ [! h! M8 q
% M. A( V1 E1 a! m5 y
mysql> purge binary logs to 'mysql-bin.001369';4 v b; N7 ]) ]/ r1 v4 C
Query OK, 0 rows affected (0.02 sec)2 J# h G; R. J2 y
mysql> show binary logs;" u6 w6 o- d* N+ X4 k* N1 i
+------------------+-----------+
# Z# f; @" o _; s- ]1 [# k5 t0 u. [| Log_name | File_size |
9 g% ^+ Z7 s6 h! J+------------------+-----------+
" B2 z: c$ e7 c( Y$ D) T| mysql-bin.001369 | 949552 |7 s% U) e5 h; w' `5 C
+------------------+-----------+0 j& R% L+ p! `+ q5 b/ ^2 h# m
1 row in set (0.00 sec)+ @) `2 K' j* ?0 ~
删除完毕;
8 {; M( t6 x. N2 \
) `( x/ @9 P% t. v- p' i定时清理日志文件
_5 J8 Y( H2 _' `5 U6 r- w- A1.主理人自己已经设置其不产生日志;
: [( o3 \0 j" C. f3 U1 S8 V/ y$ U2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);- [, Y' z+ R8 j9 y
0 {, o; o1 l. \3 \7 ]
mysql> exit
- _& }% `; {/ T9 d, ^+ u. G6 }! KBye/ Z1 Z* o0 _9 P i5 |! D* x
root@localhost:/home/# vim /etc/my.cnf
7 ]4 Y4 j$ w8 o: ^/ d+ |4 O编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;5 e4 w8 i7 U$ o3 U. m
& i( }- |) k5 m8 S" Z5 X
log-bin=mysql-bin
$ H$ v' k8 n9 q/ v( nbinlog_format=mixed0 X) E: R$ k9 p* U; p& F; [4 o. V; n
server-id = 1& r, L/ E! ?9 f2 j" ?, J% c
expire_logs_days = 10+ m k3 N5 Z! z. Q; J, {
改好,保存;重启 MySQL 即可;, q5 s5 a1 e& `1 W0 U5 _8 V7 j4 F6 l
" h% E2 T9 d/ j0 }. c" g
root@localhost:/home/# lnmp mysql restart
( o) o( d: j# @7 I+ A) b; K2 Q或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;
9 [4 y# i2 I$ c* u! j& y3 u& T. T8 V+ r! R; ^* |1 ~
##注释 log-bin=mysql-bin% L9 E- a( u2 U1 H2 N! @
##注释 binlog_format=mixed* Z4 ^) }, B" R: I- G g3 n
参考1:Mysql 日志爆满,删除日志文件,定时清理日志/ X- V* m$ P- b1 u: `$ z$ a
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录0 t- Q0 i$ X' _" }( T& j
* ]9 @! m. M( F4 q( A/ `. V
Nginx 日志 e% p' K. H0 y( K
手动清理日志文件
/ z) u) ~" }: Y! ]! T. Pnginx log;7 }! w4 N7 {$ z/ l" x6 S& i& M
以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
& d& ^. h7 _# o5 \! v& s- K, _& ?: `- x
找到相关日志,直接使用命令 ls 查看有多少日志;' j1 f# t! J2 U' K+ Q4 r
0 r) I$ [+ q% Troot@localhost:/home/wwwlogs# ls
* t+ f3 f3 ?" Z) u/ Hnginx_error.log
8 l/ K3 h6 g# r; \GeoLiteCity.dat limbopro.com.log
* d; f4 i, M4 u# s% eaccess.log
' K4 n- A9 p9 s使用 > + 文件名 清理日志文件;3 u5 K% K9 J# d4 _# {
1 }4 `1 b& ?. P o1 ?: a
root@localhost:/home/wwwlogs# > limbopro.com.log. _: T/ U6 m; h6 i2 E
root@localhost:/home/wwwlogs# > access.log 1 V3 W7 f0 [$ m3 \% j
定时清理日志文件- z4 b4 X3 R! t
使用 crontab 定时清理日志文件;6 O% J& i6 H: K) N! R% `% Z
% {( X ^7 q3 c5 ]root@localhost:/home/wwwlogs# crontab -e
: ~; A& z) |( @1 Q/ I添加一条,设置每日凌晨零点自动清空日志:+ a/ y# H+ O m7 z0 R
3 q* i) x k& g7 \6 p0 u
0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志
) k- k0 C2 g* B" p* Q0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志
g3 c- M6 @$ ]) U2 d1 w保存,退出,重启 Crontab;! H5 ^3 d; k) t" ]. E L
9 R/ R+ ^- O9 F0 A5 r( e Z- nroot@localhost:/home/wwwlogs# service cron restart
: g7 c8 o7 K' z0 lroot@localhost:/home/wwwlogs# service cron reload
/ |( U( v) u) z% y ^0 f5 P*日志文件具体位置,以实际为准;本方法比较粗暴;
) h4 `3 ]& t. k6 p5 U4 ?" j5 q: W- ]4 t- e9 b
参考1:Linux crontab命令及其用法;
0 ^8 N! n6 c, L. c4 r
! U. q0 m+ {0 |journalctl 日志清理
; Q! ~$ _/ m7 S6 X配置文件路径: /etc/systemd/journald.conf;
. l1 w* d0 A* C. I日志存放文件夹:/var/log/journal;9 C- u# L' ~2 ]5 |3 C6 B" U- C& a
3 _, q2 r3 p* a; G4 h( Y% X9 \
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。
6 m0 \8 Z9 j7 L* v8 R5 i
: ]# c6 A1 z9 M/ V; E b1 ~清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:* T- {' f8 C7 M: |3 m
( _9 m& e; h9 b4 v, {( vjournalctl --vacuum-size=20M
) g; |$ l4 V' |4 P8 z- q, ]系统日志清理
* E; _) ]9 q9 V8 |3 x9 X1 k: T系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。
7 z( P% W/ |* b! w
# M8 E1 t4 U! _2 I& v, Osudo apt-get install ncdu! X, v3 L: b1 `
sudo ncdu /var/log #然后按i键, Y9 e) C# `# e2 @" R3 ^
ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help 2 P0 J# G. J- O3 I. Q4 `: s
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------3 C/ U1 q: A+ e3 z
48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐
9 H2 ^# I" j( c3 L; k! e 16.9 MiB [### ] auth.log │ │
# b, _" W9 t: d! P- Q t7 F$ E+ M O 15.0 MiB [### ] redis_6379.log 5 |# Q- ?' J, T% x* ^: X8 b
...
) Z& }+ n/ z* x4 M然后进入 /var/log/
$ b$ [) x/ O6 X! q9 m/ C: a2 M6 f! z$ I- L7 t2 ~3 M6 ]
cd /var/log/
. l+ p" g9 w4 C6 J7 U, Q7 W> redis_6379.log! k: \7 m. J0 f2 }" y: L
安装包清理% j; n. Z. e4 ]6 O) H+ ]) l! R
查看安装包缓存大小
6 l9 y* k; s: J# I, c3 o. d$ n+ W; d8 U0 V9 `% ?2 K w2 M( e4 t
du -sh /var/cache/apt/archives9 |& U8 j# P0 T& b
使用如下命令删除已经安装过的deb包( @5 ~1 G6 U; u" m" J% n
0 Y7 ]: T0 X7 D( S9 y2 ] x
sudo apt-get clean& E1 k5 K! p. @. G, M
sudo apt-get autoclean
7 i6 A: s) H6 M5 |删除孤儿软件包 已经没有用处的依赖# s3 Y4 x6 C9 z! g* o: |9 B& @
, s" I) Y# U1 B# A# Dsudo apt-get autoremove4 @1 W0 q1 b9 {3 O
清除手动安装的依赖包5 b. U' h+ j$ |) y- g( l
0 d0 E! ]4 J5 }deborphan
$ I7 ^5 c, S! `, ~+ Msudo apt-get install deborphan8 o* C1 A' h& M+ O
deborphan | xargs sudo apt-get purge -y! ~2 |) H' }+ K7 F" S
删除大容量已安装软件包4 l @4 x. f g7 K0 D
首先安装debian-goodies ?9 g! T. E! ^8 J
( |3 e/ ]5 t( D# C# Osudo apt-get install debian-goodies; O5 Y% E" g( @( {* t% w- g1 l
然后输入下面的命令
. _8 S5 _3 G9 V, Z8 _
: f$ q2 U6 W! O1 Q3 Rdpigs -H; s; g% k1 w6 O. r( \( A- T
我的输出结果
: k+ y; K7 O4 \) g0 o
2 \+ H' B" ^ f! O531.3M linux-firmware2 V/ p p% F% P I. W
315.0M fonts-noto-extra7 h( Q( K$ {9 O! I& L
282.0M libgl1-mesa-dri
7 n/ y% A2 Z) @' [6 K& c# }214.7M golang-1.13-go5 {) g& a8 c4 n! ? H
212.9M linux-image-4.11.8-041108-generic. |* e; s# G; G
181.1M linux-modules-extra-5.4.0-60-generic
, X6 J& f. E e& P1 k; r+ B" o181.1M linux-modules-extra-5.4.0-59-generic9 G$ w4 f2 i ]( N0 L2 a& s5 \
181.1M linux-modules-extra-5.4.0-58-generic
, B' v: K' C, p* g, {% E166.2M docker-ce-cli" E# P; B! e4 H" g& k7 [
123.3M containerd.io' c! @1 S$ N9 M7 k( d+ L% b4 b
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个9 g9 v7 ~8 v/ t, n4 |6 `- y1 a
+ n7 J6 T' D/ \; p4 C6 |注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;' ~4 |! T) h- m, z% r5 c
dpigs -H --lines=20) r' A) K6 b, Z- N H/ j, p
软件包卸载命令
- ]5 E* ` ?' s% m- p; m: {
2 c4 q# K, L; u# B+ W6 ?. vapt-get purge #purge 后面接软件包名称
( Y. Q$ ~) H. M+ U3 ~7 Qapt-get --purge remove #配置文件也清理掉 命令后面接软件包名称1 g! e7 k E7 x: U# S
示范 以 删除 golang-1.13-go 软件包举例;! Y- Q, E0 D q4 w" a
1 J% H$ [$ P$ n2 ~) n) k% c
root@localhost:~# apt-get purge golang-1.13-go
) @' u2 H' o4 ?; |5 C8 D6 s1 r! j正在读取软件包列表... 完成* L! {7 F( }! A) L6 x$ x* o/ ]
正在分析软件包的依赖关系树
! M* Z Z; M# s! ?正在读取状态信息... 完成 9 |8 |( m% s# ~6 E* @ a
下列软件包是自动安装的并且现在不需要了:+ _, b; t5 D V; X
golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src
' Z, B/ g/ r0 C3 S( F. v使用'apt autoremove'来卸载它(它们)。) C2 E9 ]9 |0 x+ u% O0 m8 n
下列软件包将被【卸载】:
) E I' A' ^* O+ S golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*, h: x+ C& m) ~
升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。3 i: S' V2 d* a! D8 s5 ^9 E4 m
解压缩后将会空出 230 MB 的空间。# H' L* `/ [2 t1 _. G1 G! w
您希望继续执行吗? [Y/n] Y
: s4 P: A7 o6 @( C- w. R; }# ~旧的内核清理 C4 D } {+ Z: A
查看当前使用的内核( j& ?6 R! C' _' W4 Y2 J+ u
7 C) O- G6 G1 }# G* `# o' x$uname -r6 H) P9 @7 E- M' Y* B1 `( H
5.4.0-60-generic1 I3 |; w; K8 b+ U7 B4 H$ \ v8 |6 f
$dpigs -H --lines=20
, F6 I; y8 z) B" g. f( t74.1M linux-headers-4.14.91-bbrplus' u& \& }( x- m8 k. Z9 N$ }3 h
70.0M linux-modules-5.4.0-60-generic //保留
: m w3 R! [2 |4 {' i' u: P70.0M linux-modules-5.4.0-59-generic //保留
5 E# P( \9 E7 r1 ? D/ P..." D0 H3 _! N, A' _; [- ?( j* a
看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);
% Z/ e6 z& n# u: _3 ]( n
( L3 v( ~5 H2 x$apt purge linux-headers-4.14.91-bbrplus# d' A5 m3 \ P$ d y1 O$ O
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):* l: q; s7 ~2 ~6 K/ W. ?
1 M5 u1 M; Z: S0 ]8 f$update-grub q- u3 i& Z j* E
Sourcing file `/etc/default/grub'
+ l7 ?& o5 ~* _; q9 l7 OSourcing file `/etc/default/grub.d/init-select.cfg'/ ?& Q; z, P0 {
正在生成 grub 配置文件 ...
: [5 Q+ o# T, P' V) q% M! N找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在 5 n8 }$ G0 T$ V* d0 N
找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic: O- v: q* F( B
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic: P# |% _5 w4 \2 P& ^0 x9 W
找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
& h# p, U0 U$ q" t' m3 |* c找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
' E8 A- R4 E* C! d2 j: B) C找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
- U/ d, W! _7 X) w& G7 a完成, y" ]: ?% ]% y- O; o; [. u
...4 l9 p4 V, Y J; }: i4 x
$ K# n/ p0 S7 C" [" T" a: X1 t
相关知识
9 c9 Y- j- l n! cLINUX的磁盘管理du命令详解: j% m- \, \" s( L/ M, z
! b% }/ V2 d6 I+ J3 R8 b
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。" A, K7 G! x8 [$ X" w: H! k
! V+ F2 q2 A4 c$ ?7 i2 `DU命令用途& a& a1 F3 h( Y2 W# i
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。* F, _% k) r/ u+ P- {4 u
: ^! S' Q$ {3 D+ p9 _% I! `找出大文件
+ N* |8 l" ^/ d磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:8 k1 q" P8 z) L3 @% F. o
5 z; r0 u/ A" M4 v' w8 ], I3 m
du -s /home/* | sort -nr #/home目录检测
% q& {( Z% j2 Y6 Q0 o
5 W5 K/ E7 h0 K, l4 S+ P9 ` |