|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)
% `% g' w J8 h
2 s8 x# H0 x) ~本文章实用性说明
; S- _+ y3 t& _7 _! R5 D* e& P1.检测Linux服务器的磁盘文件大小;. ^9 y0 H1 W7 T+ G1 z" X# O8 a* L# {
2.重点清理项目;
; e# H' w5 a2 ]" _" D
0 e& ]) `% S1 h+ y实用命令/ `0 i$ X& u8 _: }
0.查看硬盘剩余空间
c- [" B$ r- m" |3 k" I+ \8 X- d, `, e, ?
$ df -h #查看当前硬盘剩余空间并以GB单位表示
2 |& o. l+ D; c+ Y8 _% J& c文件系统 容量 已用 可用 已用% 挂载点; a/ n' g8 X; @9 M
udev 448M 4.0K 448M 1% /dev. x* B; [; t5 p4 O% c
tmpfs 99M 1.1M 98M 2% /run
* {* t9 C5 z8 D/dev/sda 25G 13G 9.9G 57% /
, q [+ {4 s2 h2 Q A! |: utmpfs 491M 0 491M 0% /dev/shm; h' @ s% i0 e( E. \" H6 w) k9 i3 @
tmpfs 5.0M 0 5.0M 0% /run/lock
: O0 E9 V# L% B% f; f; w( ?, e' U, p" Z: Ltmpfs 491M 0 491M 0% /sys/fs/cgroup
$ @& o4 L2 ^: P) y Qtmpfs 99M 0 99M 0% /run/user/02 S' H' A) x6 k8 H+ {6 R; I9 W3 b
1.查找大文件& i. t: ^& s: w# |* n
. P n+ V# M; Z2 L) Q4 x
find . -type f -size +100M #查找当前目录100M以上的文件6 z2 r, f: w' N
2.对查找结果按照文件大小做一个排序
) G* ` K3 o$ F, L% o- H- X
; s4 M7 S3 }8 t$ \% O; {: Kfind . -type f -size +10M -print0 | xargs -0 du -h | sort -nr
' g- M6 o- f: L# y2.1查看当前目录下某个类型的文件或数量
+ S z7 H& Y$ G% p s4 M: d( K2 M
8 |8 U# h6 [/ a _) j# gfind . -type f -print | grep php9 I8 n! v) g9 w6 O3 [/ \
find . -type f -print | grep php | wc -l
. t" Z' z9 p Q3.查找当前目录下前20的大目录9 D* Q2 {: y' z! j( M0 T9 O
6 u( d9 t! ^3 Z' d# ?4 j2 a* mdu -hm --max-depth=2 | sort -nr | head -20: \7 |( Y: T6 H! k5 M
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;' e: U9 p. I: F H, o
8 ]2 o+ m$ V4 o) w; O+ E/ K
4.计算当前目录下所有图片大小,单位为MB;) I1 N9 D/ V6 K' Z; u
& |' g' V# o3 O4 b5 V0 ~* s+ z
du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'/ ~/ i! G& K( o- T3 x8 E
重点清理项目, D) z$ _. |( D8 P* q3 v: \1 e6 x
Mysql 日志
* x6 `- z6 i! h/ J3 f5 g手动清理日志文件$ m( M$ x0 H$ U; Q% {
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
7 Z5 A7 T$ n+ d9 D% z) x' b. b) R" M& n3 [- n
1.登陆进入mysql,并使用 show binary logs; 查看日志文件。
$ s: ^0 t% h* e5 j+ _5 `
. |3 }' Q: @5 B2 Droot@localhost:/home/# mysql -u root -p
& a" D; P+ Y; f- y' B/ JEnter password: #输入数据库密码& u4 Y x+ }) z ?# {9 m
mysql> show binary logs;3 u! f$ A& y% E2 ]2 x
+------------------+-----------+' I f8 H- e. t7 z/ w
| Log_name | File_size |
2 W9 s/ y$ Q# H* V7 j; F+------------------+-----------+
x. g: Z g9 p: U4 P ?" o: X2 Z) a| mysql-bin.001368 | 3175578 |
% \- I! n) x( r3 N| mysql-bin.001369 | 177599 |5 C5 N* s+ U& D2 w# X1 n4 A
+------------------+-----------+
# |* j! X9 Z: {1 O( ]6 ^2 rows in set (0.00 sec): N( n% @) g# ?% `) `. Q
2.查看正在使用的日志文件:show master status;
+ B% z7 M& S4 f6 {$ P k5 v7 Y+ s) @1 H
mysql> show master status;( q# B' k& @' w& _, k7 A4 G6 v2 ~
+------------------+----------+--------------+------------------+
6 \7 _/ G7 B* e| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |, H$ G; L3 P4 k, C' U
+------------------+----------+--------------+------------------+
4 d7 r1 e Y) p: e* ?| mysql-bin.001369 | 348563 | | |
0 o: E2 S5 A: P" G/ b. n( T5 e+------------------+----------+--------------+------------------+
. k6 ]5 {8 M5 B1 O0 u' S" b+ L- T1 row in set (0.00 sec)
2 T5 ]" j4 W) m. Z1 U8 A1 C如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;
& Q, X& ~4 O4 L3 }
U) r: n: G/ |" X$ Z, y3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';
$ G3 d! ~- i+ @: E: B8 W' k& f! j1 G* \' D# f
mysql> purge binary logs to 'mysql-bin.001369';/ Q' m( P5 i6 x2 d9 r B
Query OK, 0 rows affected (0.02 sec)
, e( @$ n0 m7 |) Dmysql> show binary logs;
$ x) Q: b/ Z r2 J! J5 T+------------------+-----------+) ~* Q& g) f/ X X* R8 u
| Log_name | File_size |
) W5 V5 U+ O6 s( G# h+ J2 ^+------------------+-----------+& ]' d4 Z- [- D7 Z+ F8 [- Z4 ~
| mysql-bin.001369 | 949552 |5 F) b' Q2 V* [, s( E
+------------------+-----------+
- b3 ^; g' I9 m) n2 S5 }5 X1 row in set (0.00 sec)+ V) g; w: _- q; T9 R) l! t
删除完毕;
* ^% J$ P4 y1 K
. D/ m! R! \3 I! b% P, v! u定时清理日志文件
* B+ G7 i% P, ^: y3 a( C: h! K, v1.主理人自己已经设置其不产生日志;
/ Y+ A+ M6 H& L# I& C5 P2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);" j6 s7 {$ y8 a
1 V) s( a- H* B8 \+ W0 L
mysql> exit
3 o$ o% \. `0 Y- a" l4 l) t; wBye
9 o0 N. H; E& n2 I0 hroot@localhost:/home/# vim /etc/my.cnf
{& s5 W5 X* m, `' t编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;
+ V5 z4 }' B; ~* q8 Q& {9 q" K% t' q- O* @& L
log-bin=mysql-bin X9 N' Q {( d, m1 E! u1 e
binlog_format=mixed
1 O1 Z. V' A4 i, fserver-id = 1$ o G# q3 [; j+ G. l
expire_logs_days = 10
5 a7 i8 X+ f5 K$ m改好,保存;重启 MySQL 即可;9 m4 x* J3 Q9 ^$ [
4 G1 T( ^& M; @5 C6 o% D5 kroot@localhost:/home/# lnmp mysql restart- H3 {3 r2 R) i6 K# E; E; I, |6 m! N
或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;8 I+ K9 C! Y; W2 j$ K* a- n+ G
- j1 Y) {0 _; t0 K; i4 G##注释 log-bin=mysql-bin8 o( s1 T" P6 ~3 s' v: e
##注释 binlog_format=mixed
9 X6 E- p/ l& c. W: [3 @( Y! w6 p) |$ k2 j参考1:Mysql 日志爆满,删除日志文件,定时清理日志
" b& v) P. f7 b: [参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录8 H" }8 p9 B/ F' i7 ^9 t0 ~4 j
% a' r- _5 L8 h- D& J' l# `$ ENginx 日志9 f* K4 M f1 O) y
手动清理日志文件
# ]$ x( j& L( b/ J: D9 k9 cnginx log;
& L3 Q( h4 `6 A" Q以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
; c. F1 |9 e' p. G
6 Z6 j0 l _) y- ~5 x2 }& C$ a5 l找到相关日志,直接使用命令 ls 查看有多少日志;& l: F# X6 w9 l; S/ O$ y% a
- l+ L. @3 e, g" t% P4 \root@localhost:/home/wwwlogs# ls
) U: j3 q/ t: h5 Rnginx_error.log V! M! N+ R d4 k7 i
GeoLiteCity.dat limbopro.com.log / ^7 q; ?3 N$ y9 z# `2 j5 s1 }
access.log
- X8 Y% }' `$ p$ r. O W使用 > + 文件名 清理日志文件;' a, B; f; o' t, m6 d
! ` V6 B$ ^1 J, L% z' ~6 Zroot@localhost:/home/wwwlogs# > limbopro.com.log7 C$ `1 C) U5 S* X' f0 {" L; m
root@localhost:/home/wwwlogs# > access.log
( H7 n* l, R$ {% s$ r1 z定时清理日志文件% Y! k: W+ i9 O! y! C$ C* g
使用 crontab 定时清理日志文件;
. U! v. m, A; h& y o/ S8 n
5 F: V# U% c6 @7 v+ a. Jroot@localhost:/home/wwwlogs# crontab -e& t \" Q% B; M, Q
添加一条,设置每日凌晨零点自动清空日志:
1 [$ s$ B* F. Y' r9 p- V9 [$ b9 f; h. I Q: C
0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志7 b* f+ q- s# _3 I: ~; ?+ V" Z6 G! O
0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志3 ?) Y8 S) R3 U
保存,退出,重启 Crontab;
* H u7 s$ M9 g+ Y5 l6 z$ h. x: S7 b: k9 `
root@localhost:/home/wwwlogs# service cron restart
( |9 [$ \% [% r. P; L% f6 uroot@localhost:/home/wwwlogs# service cron reload# C9 W1 k% f! t# E" B2 y R( W
*日志文件具体位置,以实际为准;本方法比较粗暴;" A7 ?- \ y+ c. o, F+ v9 Y
' r6 L2 u" q9 L y: d! M参考1:Linux crontab命令及其用法; x2 j$ R* z; c. }2 \) e: S) Y
9 |! e; m: k; d2 g9 ^
journalctl 日志清理; W: l/ }8 `' R y- U
配置文件路径: /etc/systemd/journald.conf;
: o& J- \# f; n: O; S1 `3 Z日志存放文件夹:/var/log/journal;. F$ i$ Y' E8 U; b' Q4 N0 x1 o% m
1 W, c" v+ ^- s! @6 e9 w0 ^( F, y5 |
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。 n$ \0 N% i) B& \" |% ], W
6 p/ _. x% q- a, e
清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
* R0 E* D, b* `2 {7 K2 \; q! p/ L) U3 q# L) k
journalctl --vacuum-size=20M
! w" r/ p" p7 K3 Q& h }2 V系统日志清理7 Z/ f) C1 t/ N2 q
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。5 A2 h# J2 r9 ?: I4 y( {* ]
" S/ P; F2 W& u6 P# L2 asudo apt-get install ncdu0 J2 J) v: f5 c: k
sudo ncdu /var/log #然后按i键
& b7 [/ t4 u* i' o! O% S! e. R8 zncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help . P& w4 ]% g' d0 @+ l {9 _
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------% i8 k/ t) r* d# a. J
48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐
: b/ M* P$ B& ]* g) c% L% ~8 T 16.9 MiB [### ] auth.log │ │
" y5 Y7 k" A2 q7 b 15.0 MiB [### ] redis_6379.log
7 z- V1 x3 N6 `" ~) \+ U.... e+ e6 h4 [* N8 |7 @. B
然后进入 /var/log/
3 Y' X- D7 K" B6 f# L/ z Y2 f+ Z* F! T. j
cd /var/log/
2 r% T3 a& k( K' j> redis_6379.log. v* l8 g$ B- o' @9 M, b
安装包清理
# l0 J" E- h- {* a( R- j9 H1 A查看安装包缓存大小
; G4 V+ t. X9 D# A6 ^2 U
7 p e: A" s' e# odu -sh /var/cache/apt/archives
6 z- W6 h( B' p0 _) ]2 |使用如下命令删除已经安装过的deb包( D4 v2 r! Z- X1 F f: F
4 g8 W j6 _% b8 B4 E# E, T5 A( n/ rsudo apt-get clean
K, ~0 q0 Z0 [6 t- @; A3 psudo apt-get autoclean
5 c- c0 U# K8 j: P q删除孤儿软件包 已经没有用处的依赖, E7 l, Y" T# b: `# E
" }% N9 v' }+ m9 \* G: }sudo apt-get autoremove
. r7 V1 E& S+ p+ c清除手动安装的依赖包" I) ~6 j8 K" f+ j
1 d* B" ~8 @5 u1 u9 B$ \0 J; P* ]' Y% Xdeborphan k. {9 v( K1 |+ f7 Q" M5 @
sudo apt-get install deborphan
4 R6 K) m0 M( j1 rdeborphan | xargs sudo apt-get purge -y2 Y; _3 d3 F7 I; v# L) E2 k
删除大容量已安装软件包
% D) E9 p' z. z首先安装debian-goodies6 x* J* `) o& _7 B: X
9 s8 ?* V; I( u# C3 o1 M- zsudo apt-get install debian-goodies
; ~; z2 V9 ^0 s2 ^9 Y然后输入下面的命令, H" X( ^) `( S7 M! G7 S( d# h
* l/ Y. {7 F- @- O6 @( N3 Y" v; {& A1 E% H
dpigs -H
$ r* V9 W2 ~, \1 u% P# R. Q/ h+ m; [我的输出结果
2 Z! A1 x. h8 a2 a; `4 w$ }5 V: f4 G! v$ q( }& o
531.3M linux-firmware
7 e8 q: Q6 T& E) l/ H) R' f' v4 E6 F315.0M fonts-noto-extra' J0 b: c8 O1 g
282.0M libgl1-mesa-dri
! R" h7 v2 H! b6 m& B) L/ B9 O( ^214.7M golang-1.13-go
8 Z! y) T, d" S7 c9 [7 k212.9M linux-image-4.11.8-041108-generic
# g" U! C" A6 f: N181.1M linux-modules-extra-5.4.0-60-generic2 A& U; a# f) r2 F5 q; c
181.1M linux-modules-extra-5.4.0-59-generic G9 @, S0 v8 Y) p L
181.1M linux-modules-extra-5.4.0-58-generic+ Y5 d+ M. W9 s7 ?: \8 ]) S# y2 F
166.2M docker-ce-cli& {# E( z [5 K. p8 ?
123.3M containerd.io
; k3 Y; i4 l; J r( k( v' ?4 Z4 r上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个7 l7 e D' W0 U+ G" q; i* s3 S) |% n1 F
* V3 ?2 I$ R/ r1 |注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;+ h5 f" @; P$ o3 S' @3 b
dpigs -H --lines=20
3 o5 [: s( S, a/ m N6 L软件包卸载命令
, x$ c# A* j: O9 y5 G) Q" O* W# H* I
apt-get purge #purge 后面接软件包名称
6 f0 M, z: Y, b; W$ O. ~- F& S# ]apt-get --purge remove #配置文件也清理掉 命令后面接软件包名称
# t: \; y6 `7 d; \示范 以 删除 golang-1.13-go 软件包举例;
; V. M" d/ l& Y6 V9 ?
7 U& ^( ^- M1 X) c. jroot@localhost:~# apt-get purge golang-1.13-go
$ n* c/ B6 p$ a8 E正在读取软件包列表... 完成 O2 N+ s- b$ H6 N0 k% m$ J
正在分析软件包的依赖关系树
" D* P0 o* G/ ]- _4 p) e/ a" z正在读取状态信息... 完成 ) v$ q- `6 T. w% b
下列软件包是自动安装的并且现在不需要了:
. S. U, P! v6 K- N golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src$ q; ~) h$ e6 S/ R- w
使用'apt autoremove'来卸载它(它们)。/ c) x8 `; a1 {# N. K4 G9 [
下列软件包将被【卸载】:
( }6 _: o9 }2 `; {8 k1 B+ q golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*
0 H5 M! R/ u+ E$ O; N升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。* Y$ W; \- v" O
解压缩后将会空出 230 MB 的空间。
7 y- k* ?5 N+ d( \$ H( J您希望继续执行吗? [Y/n] Y4 q; F% ?% \& ?7 \
旧的内核清理
* j) t4 F! a* s查看当前使用的内核
`5 i w% J; N( K+ b- Y3 R% E0 P9 ^& A) j, y" L$ t# R
$uname -r( D/ [$ K, N. k1 |4 I
5.4.0-60-generic
7 F2 g! ~$ f1 @5 F O1 H( o4 h$dpigs -H --lines=20
3 q" V4 W$ e* |74.1M linux-headers-4.14.91-bbrplus5 S, [8 s" c" b: z, N% w4 T& q
70.0M linux-modules-5.4.0-60-generic //保留, ^7 `" z7 Y. ], \. S+ I. @3 U
70.0M linux-modules-5.4.0-59-generic //保留
5 s' Z0 T1 t9 c3 N/ c+ x& q" ]7 n...
6 [- ^% i# P- z U9 k( B看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);6 z* `' x+ `- G
3 q+ |$ p+ S* D1 o* |$apt purge linux-headers-4.14.91-bbrplus) l5 N& m4 T* |9 s, v* z% R
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):
* W4 j9 y; Z7 R3 d3 A5 y& `0 f8 x" _, q$ W' F) R4 s
$update-grub
. ^& C! m- A, a$ kSourcing file `/etc/default/grub'$ U: |0 U5 i: d: c' Q1 _
Sourcing file `/etc/default/grub.d/init-select.cfg'
: }: U* t, g: Z8 G; U* o正在生成 grub 配置文件 ...
! k0 l, z4 e& @* V5 A; ^找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在 2 @, j; y7 P/ m0 }
找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic$ E5 h& M) ?* N* ^
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic+ z Z( j* _) f* C6 D
找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic% e0 G* y6 ?* l2 _- @+ G. _! K
找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
8 {& K# y e, b; i: N找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic( P3 I, m) s1 }' a
完成& }1 S: D; f+ M# J3 k+ f0 u5 _
...
/ N# }. `, L3 k2 s1 s( v4 P( G. p' Q
相关知识; H0 y2 ?7 n6 D, g2 g4 w- `
LINUX的磁盘管理du命令详解
& d- P, U2 p& b' c* @0 q( u+ p J# t7 [; g& a) X
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。9 x" E) ~0 J# l( u B* [
- G8 F! t3 F+ Q p& ?( m% Q6 {
DU命令用途( ~5 e' _' G# a
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
! H, z- C5 R6 H- w1 C
/ I# H( a& ^( I* o4 L4 C找出大文件
- m0 H6 i2 ^$ F I2 ~' w磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
0 B/ ]0 W. v, G/ D3 s5 G
0 W& X8 e" o/ mdu -s /home/* | sort -nr #/home目录检测* R4 u9 d$ [4 S1 g1 U4 q t
# v: i ^9 j, R/ K
|