|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)- h' C' m" q/ B; g, D7 N/ ?- q2 q
: H3 @$ d, q0 q0 {
本文章实用性说明# d' A- _+ F" x+ X/ Q6 z
1.检测Linux服务器的磁盘文件大小;
% X9 ?( f7 ~9 W7 |, P) [' P' k0 C2.重点清理项目;) w2 V# G' p( r, H$ E _
( \( w3 r- T# ^$ [+ [; {4 a4 D: _
实用命令) S5 n/ Y: u) I( C: Y t6 n
0.查看硬盘剩余空间
3 D: [' J7 Z7 D& M1 ?: G3 W3 ]. b2 [% M- d+ g7 {
$ df -h #查看当前硬盘剩余空间并以GB单位表示2 S4 w* w( ^) ]! s) z7 `1 f e
文件系统 容量 已用 可用 已用% 挂载点
* C. X9 ~- l `" Z6 C9 uudev 448M 4.0K 448M 1% /dev- ]) p' a9 I% i! t3 g; M+ X
tmpfs 99M 1.1M 98M 2% /run
5 ~2 {, f( j$ V$ J4 @/ ]5 e/dev/sda 25G 13G 9.9G 57% /
- C% m" E W0 \+ g9 Xtmpfs 491M 0 491M 0% /dev/shm7 D5 r& J1 g+ e* A/ v) j1 g
tmpfs 5.0M 0 5.0M 0% /run/lock' ~3 y8 Z3 ?) m) o
tmpfs 491M 0 491M 0% /sys/fs/cgroup! b. U: Q/ {7 e7 X, a( a
tmpfs 99M 0 99M 0% /run/user/0
' Y2 X$ M- s8 ?" j: V1 e0 q& F6 G, }7 i1.查找大文件1 Y2 f$ i* G" k& ]1 p9 k
3 _+ D0 F2 I, u% ]find . -type f -size +100M #查找当前目录100M以上的文件! K0 S$ ~$ g& Z6 o% P% O
2.对查找结果按照文件大小做一个排序
: G7 c% y$ J a \
* Z$ b" E2 O( ufind . -type f -size +10M -print0 | xargs -0 du -h | sort -nr/ U+ U8 \ n8 `7 A% ]
2.1查看当前目录下某个类型的文件或数量! p; Y/ z0 |6 T
+ N# H+ Y) S, S: r: Z+ L6 [
find . -type f -print | grep php! l; L, M7 Q; n; Z
find . -type f -print | grep php | wc -l, r6 k8 z) J6 J8 h
3.查找当前目录下前20的大目录& E( R M# k) }; v) c1 Q4 y
( g. h' {5 _5 S0 n$ i
du -hm --max-depth=2 | sort -nr | head -20% r) z) u! T& R# m. Q+ l
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;7 y( ?2 H& L" p' q8 _7 F
! q% k8 w% ?. |4.计算当前目录下所有图片大小,单位为MB;
" t5 ` d/ ^7 |' L" U4 W5 A( }# g! g C# k8 _) f5 x; o
du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'% z, J, K6 q7 O
重点清理项目- c, T, \4 M) X! S& j+ O
Mysql 日志) Q: a, Y% t1 h% D* W
手动清理日志文件
7 x4 C5 `2 h( b: g5 H' i; zmysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;7 f, x) n( ?2 z9 j
- D/ Q1 G9 a0 h2 a
1.登陆进入mysql,并使用 show binary logs; 查看日志文件。
% f( [6 P) S3 r& _- N# `- m3 p. u* z) h& g
root@localhost:/home/# mysql -u root -p; S: r* C0 @& R! U
Enter password: #输入数据库密码7 ]# n( y, R6 P0 U _! U. {7 m* ?
mysql> show binary logs;; K4 O- i: T, H) ?8 F7 O
+------------------+-----------+
0 C5 `% F1 W( k. w2 i- M! w$ O| Log_name | File_size |" o. }1 W: k' \1 b! }4 t) V: K
+------------------+-----------+
+ h/ K& J0 Y. ?( N5 d: Q| mysql-bin.001368 | 3175578 |
2 V6 e5 D1 h: o5 \* a4 w. ~| mysql-bin.001369 | 177599 |/ q j5 r4 G7 D9 C) S V/ l2 M
+------------------+-----------+6 z" Z6 Z- F9 O
2 rows in set (0.00 sec)
5 U1 p) U F& W' p3 A# H2.查看正在使用的日志文件:show master status;; p, V, U9 K* a' _
( s9 ?+ B" r+ Z6 Qmysql> show master status;
5 P6 a t- Q# v9 c% A" e+------------------+----------+--------------+------------------+/ M- p8 m( A0 H: f. W5 Q
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
$ Z9 t# [$ t5 l" u3 B3 `+------------------+----------+--------------+------------------+
4 W# V$ P: F+ g& X* G| mysql-bin.001369 | 348563 | | |+ c- o4 n) y# P: d/ L% m( S
+------------------+----------+--------------+------------------+- ?/ K& f6 e( n' Q$ Y [
1 row in set (0.00 sec)" S0 G% n( @- @& B+ c9 f5 [; S* s
如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;
7 e8 |4 s2 N- g( e/ b7 c0 a0 |) Y) W5 |3 G4 {. R2 T* a; S
3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';
5 O7 g' l* N$ P1 D: u7 W+ |$ M
4 K% A ]2 R0 nmysql> purge binary logs to 'mysql-bin.001369';5 \: z% A ^6 w9 X$ z
Query OK, 0 rows affected (0.02 sec)) Z- U- E5 \" Q% u" M1 y% ^/ e4 w
mysql> show binary logs;
, b9 }$ [4 i5 A. I( {- Y+------------------+-----------+
) S' O: B/ J! i7 Y| Log_name | File_size |' ^% H0 u8 K9 w" a
+------------------+-----------+7 `0 R, D$ V/ V& M e, q. p) F9 M. W/ p
| mysql-bin.001369 | 949552 |
, ~; ~/ S" `# T* Z/ J+------------------+-----------+ t$ \1 B" W; p0 s% U1 z
1 row in set (0.00 sec)' s* V# e1 f3 ~ M
删除完毕;
% C/ ?7 ]! H z n5 O5 R8 i1 X" h' j! C6 o" e1 [( \6 P
定时清理日志文件
4 i% R) e" u9 J/ C1.主理人自己已经设置其不产生日志;
$ B2 @! |3 a( M& d2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
; @9 |8 o* s. K" W5 W! |: s/ b0 z7 J! A* m9 }
mysql> exit
+ W9 T5 L& z2 OBye
8 w# v4 W0 j& I- W# `8 ]9 ~root@localhost:/home/# vim /etc/my.cnf
# N* z8 R$ `9 B& @$ z: _编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;( L' Q! _5 p n
1 X1 G1 p& }$ e5 L& S. Blog-bin=mysql-bin
0 I% M2 j8 j" @/ vbinlog_format=mixed
% ?+ @0 x. @# G: \ u* mserver-id = 1 y& i; F1 O! G0 O6 m6 K8 u
expire_logs_days = 10
3 a$ @3 Y0 b! m* y改好,保存;重启 MySQL 即可;
. u& a5 q3 N7 B# t6 v6 P' I1 B6 W: K2 z0 ?/ s$ ^
root@localhost:/home/# lnmp mysql restart
& D( X/ U- l8 l1 i或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;- E6 x1 i8 C2 y& _- H
0 t6 k$ s, \0 p- V3 ]8 ^2 ]
##注释 log-bin=mysql-bin
- S" g3 {5 n: l/ l7 |##注释 binlog_format=mixed
2 B U4 E" } M0 C( Z1 L. W2 k+ o参考1:Mysql 日志爆满,删除日志文件,定时清理日志7 \1 Z- }# V5 \7 |
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录, r. X! S7 l! R
* ^& V Z/ N8 @9 xNginx 日志$ O* j1 C( d+ R% `' I
手动清理日志文件- q7 o) h2 V; |1 t5 R
nginx log;4 ? ^4 T+ d* m( i
以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;! u$ E' C; R& a$ `
4 J L, ]0 p4 b9 Y* ?: _% N
找到相关日志,直接使用命令 ls 查看有多少日志;- B9 S/ P" r( s% p
i* o7 \$ f) S% l" {5 f2 ]root@localhost:/home/wwwlogs# ls! X8 p( T+ H( n" V& g
nginx_error.log
% U$ D7 p5 T$ DGeoLiteCity.dat limbopro.com.log # ~4 {' ?- i. a! g$ e* y0 d" \0 J
access.log
( E9 d3 I% l: w! G使用 > + 文件名 清理日志文件;
& p6 K% ~5 g, B+ T3 j
s+ h4 C r/ _+ }root@localhost:/home/wwwlogs# > limbopro.com.log
$ W' d5 B2 d, Lroot@localhost:/home/wwwlogs# > access.log
" M* | ~2 v4 f0 x4 K8 p定时清理日志文件
. J( b Y W g. W! O) J使用 crontab 定时清理日志文件;
( _( f% O3 S2 [& {, e
' S/ G3 ^$ Z1 c! V; w) q$ @root@localhost:/home/wwwlogs# crontab -e Q4 R- P+ c% |' i9 `
添加一条,设置每日凌晨零点自动清空日志:# x6 }1 O' E4 t1 m) V
' v4 a, p; Z0 x0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志! b: s* P8 ^) d9 r
0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志' `5 f5 Q! |2 x) [6 M8 X" ]% W
保存,退出,重启 Crontab;
0 w1 K. s2 [) A$ E6 c6 w- q
! |3 V0 n. l, v _: f' w$ ~% u# \root@localhost:/home/wwwlogs# service cron restart
y: x1 y/ v1 U( d4 x5 broot@localhost:/home/wwwlogs# service cron reload
& Y; K) A- K. z! p! s) t5 C*日志文件具体位置,以实际为准;本方法比较粗暴;' B' {$ w& z" B& k- ~+ }
/ r4 [# I$ y/ ^: E# y参考1:Linux crontab命令及其用法;- y5 ~8 Y: r* v: a
3 `% R" T$ U c7 k
journalctl 日志清理
% |; B# C4 @( ^( I7 u) w配置文件路径: /etc/systemd/journald.conf;
1 g; C6 t2 k+ d$ U; N6 Q日志存放文件夹:/var/log/journal;( m' r& E; a2 k$ U# {) {3 F
9 Z5 ~) w! H# \
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。
" U7 W8 p) p9 A" @% l; `$ k' m s, K+ K+ B
清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:0 U7 z+ J9 B2 c, A' a0 I
+ q0 S% c+ Z. K9 Z* }' C4 @) {& vjournalctl --vacuum-size=20M( `; f+ |3 N/ r, _+ m }& J$ G
系统日志清理: g) s ~( e1 c) e# `; y6 n- p. i
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。
' B; y9 X* Z) l" n: \* y' W) I; Z8 ~
sudo apt-get install ncdu5 B( m* j+ g7 I& j2 a
sudo ncdu /var/log #然后按i键5 Y7 B6 P8 b0 f7 P& h5 R+ @8 q
ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help " Z; P2 V, d$ V# u: W: m4 Q9 n
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
8 T2 O* u, V1 u3 X% [; i F+ w/ k/ Y 48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐
% U+ v6 m \; j 16.9 MiB [### ] auth.log │ │6 H( d3 [8 J3 G
15.0 MiB [### ] redis_6379.log * [; Q. c9 p% W$ C& Q* T# ^
...2 |2 Z# G3 g' c0 F& f- I* z( q. m
然后进入 /var/log/3 a: t& h# w0 I T9 R/ D2 D, E! k
# p/ v+ {- |$ A" i$ O9 h
cd /var/log/
7 O9 b9 O5 }( v# n4 m3 g> redis_6379.log6 d( E% b; ]3 p) S5 H( W2 b& o
安装包清理
. u- i, Q$ { s; w查看安装包缓存大小, x% h8 {1 u+ B# W3 E/ v
- q1 I1 I! @1 f" }du -sh /var/cache/apt/archives3 W6 W' p& ^2 {7 z5 a- ~2 `: {
使用如下命令删除已经安装过的deb包$ J6 Q0 o, K( m$ a1 {$ }
5 w: q$ z! D3 V, e! V! f; f" e
sudo apt-get clean
U. o% Y( F# ^# @% ~# I o, Lsudo apt-get autoclean
) z2 M- D) Z% G; u& Z& y删除孤儿软件包 已经没有用处的依赖; m% y/ W; s2 \5 G3 A1 d
; X, S3 h- ^# d. _
sudo apt-get autoremove
8 \2 s5 e7 R0 Q清除手动安装的依赖包
$ f5 c8 M6 Q8 V M) f7 Z2 w1 P5 c) p) [% r& w# V( ~
deborphan
+ G# Q& J& }: W$ j; R/ [5 qsudo apt-get install deborphan0 B8 e" K* K4 k% W5 D
deborphan | xargs sudo apt-get purge -y
7 A# k8 ~; ~8 D5 ?* P) d3 p; y删除大容量已安装软件包
3 H8 K2 Q3 z/ n首先安装debian-goodies
: N+ G+ |+ n1 ~2 E+ ?0 }/ J Z! |+ }: q
sudo apt-get install debian-goodies
# C b6 }6 F2 _% V/ Y: g4 m然后输入下面的命令
0 z# Z4 O% f+ B. m {5 I% w1 e
$ T7 `* E* H b9 R# \" e3 e, m: W: Ydpigs -H
# f! @* |- b7 c我的输出结果7 }1 O9 ?: N' a: g- [* J3 z
4 a2 ^% j, @$ L; r! G3 a/ z531.3M linux-firmware
3 S7 E& e2 V" g$ O315.0M fonts-noto-extra
/ Z- S2 d- s9 i' D) ~0 q4 n282.0M libgl1-mesa-dri) O h# W4 M% O2 n/ `
214.7M golang-1.13-go" ^/ @" |. y7 X' \+ R
212.9M linux-image-4.11.8-041108-generic1 K: p" b" O% o3 _9 ~- n! G% g+ e( `
181.1M linux-modules-extra-5.4.0-60-generic
; j0 R# G9 i H% S" m" r& J( G, ?181.1M linux-modules-extra-5.4.0-59-generic
+ g7 A% L o/ N181.1M linux-modules-extra-5.4.0-58-generic
$ K) C* X+ G; Z7 b8 T i! `166.2M docker-ce-cli
; w) f) ~ } \123.3M containerd.io0 ]+ j4 Y# I% R! G& l- y
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个
7 r( W! p. N) \: K
5 G; B) }$ q$ I- a) y注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;
9 U2 q6 c C* F" p( w5 C% Zdpigs -H --lines=20$ B; e$ v- A2 @ v z6 l7 U5 c
软件包卸载命令
8 m; D5 J D1 |% T2 z- e+ E3 I$ T( j( F! ^# r8 S
apt-get purge #purge 后面接软件包名称
. Q; O, U- h! Z0 L/ gapt-get --purge remove #配置文件也清理掉 命令后面接软件包名称! q4 s: i- p' [, o8 B# n7 [
示范 以 删除 golang-1.13-go 软件包举例; M* `! Q/ K" D+ I$ K5 r5 T5 W$ C
$ e2 ^' g9 E' s+ w# zroot@localhost:~# apt-get purge golang-1.13-go
6 A6 N1 R: l9 t正在读取软件包列表... 完成" t* m. k) r) X% O
正在分析软件包的依赖关系树 + }3 M' |- ^% d7 j
正在读取状态信息... 完成 * x6 n& V! N g2 o3 _) O+ b% ]5 n. o
下列软件包是自动安装的并且现在不需要了:! H1 T7 f9 E9 F- ?& l
golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src* T: G# {! Q) r; q; C4 V
使用'apt autoremove'来卸载它(它们)。
) s/ h0 u! Z! G$ I3 A5 a0 D下列软件包将被【卸载】:
0 i1 n; U0 @: J. f9 ^: l5 ~ golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*
, E% ~9 X$ t4 P* \: L升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。
2 M+ w. Z! p$ R2 N解压缩后将会空出 230 MB 的空间。% x! v G) o) K. ^# s
您希望继续执行吗? [Y/n] Y9 \ N) l/ p) B+ o5 n, W7 t
旧的内核清理& }8 Z2 x6 P3 ?" Z
查看当前使用的内核
) c: n- `2 E6 q" p5 R4 n' Y) f5 r% n" q" p* p2 T
$uname -r; I% w5 y7 E. r! V% D. [3 k: M
5.4.0-60-generic& T: ^! J8 @- y8 O5 d* Z
$dpigs -H --lines=20
) a% S9 n/ u& h1 M74.1M linux-headers-4.14.91-bbrplus# v5 K5 J7 x7 g; J0 @
70.0M linux-modules-5.4.0-60-generic //保留
/ W7 i# l8 J1 B5 m" {70.0M linux-modules-5.4.0-59-generic //保留, h0 |. x% N! P2 k0 W6 M
...
8 `. {& O' f, R% n9 i& T; ?* M看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);8 m4 Q. N P/ l' n: h. h
0 l* m/ l! m7 u% ~$ h$apt purge linux-headers-4.14.91-bbrplus( m, ~) C3 ? s5 M2 i' p
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):
( Y$ s1 c: ]3 N2 \; {/ `$ M2 n* W& |! f8 K
$update-grub K0 b0 d+ t9 m3 `8 }6 G
Sourcing file `/etc/default/grub'% v6 D: h) _$ M1 d, w1 j; o
Sourcing file `/etc/default/grub.d/init-select.cfg'
0 l; U- y% i: q7 z! a& x$ I) T, I正在生成 grub 配置文件 ...$ z. I& q0 @9 o$ r, X3 R0 i( S9 {
找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在
2 a8 ^. l# `; ^4 M# }! y" b找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic) R7 k+ Q" i, F* I% Y
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic
8 O: e* ], ~2 V: M* Q( K* ?8 M0 s找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
7 a1 x4 }' x3 D# N, u4 _找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
o9 W J$ Z& d4 a3 P f9 f找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
6 B# y4 @3 l4 }9 L& L5 M7 r完成4 F. z' r& i r" H- ?1 `$ M
...
3 Q; u% q& T# [3 ^1 W4 ?% ]. G
: @9 K7 R, Q9 W9 j; O& }相关知识
/ b! u$ h# y- V! `+ wLINUX的磁盘管理du命令详解
* I3 `# ?' P- Q& V2 Z; ^
! b- ^; U7 k) c9 S; R: jdu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。' E# `( N3 Z, u" x, S t: y
1 m I3 G9 [2 j& VDU命令用途
+ h6 i9 N8 x9 P! \6 x5 S2 ^du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
) S# A/ `4 x* G: q+ e4 h; k5 Y5 G7 |/ {+ a+ p2 S/ ]
找出大文件" m1 t2 j# i6 y' r* X$ C6 Q' J
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
; D7 P2 }2 u# y4 O
! L6 Z& s- R7 q* y# mdu -s /home/* | sort -nr #/home目录检测5 A7 G/ y" K# T+ g% o* \
# ~* w6 z4 P0 a6 l
|