|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理), C. x( U S9 |( Z1 ~4 ^. ]) I4 W# ?
) s3 G6 n% T7 }: `
本文章实用性说明
7 r j! ]5 v/ U1 u0 k1.检测Linux服务器的磁盘文件大小;
. h, K0 L; a0 X9 }/ L" `5 G$ }2.重点清理项目;
: r) y5 _+ P* n. {' B' q0 i0 P0 n' o. M9 M8 U; Y
实用命令
" `, a+ v1 S ^2 A7 o0.查看硬盘剩余空间
1 ?: ]7 Z! T3 G/ B5 g6 j' e# x% E& \4 J. A5 @
$ df -h #查看当前硬盘剩余空间并以GB单位表示
8 [# K x6 [# q+ a! `文件系统 容量 已用 可用 已用% 挂载点7 @ c" g& B# Q' d6 P
udev 448M 4.0K 448M 1% /dev/ f2 v+ d9 M9 ^6 M; V! Q
tmpfs 99M 1.1M 98M 2% /run
+ A; R5 F/ m2 l6 x/dev/sda 25G 13G 9.9G 57% /
: G0 S. n' Z( j1 d/ e. H( O& Otmpfs 491M 0 491M 0% /dev/shm0 o* R& K( N) t" U. Y1 B; G( q
tmpfs 5.0M 0 5.0M 0% /run/lock
7 c+ j) R& o+ {, L# ^tmpfs 491M 0 491M 0% /sys/fs/cgroup
# x% f) \# C* m. R% ?, ?% L$ @tmpfs 99M 0 99M 0% /run/user/08 b/ A, X: D8 \; a# M" }& J
1.查找大文件
0 z: [5 V! F r5 l$ h$ u1 A7 V6 w+ h6 `1 G( k7 u
find . -type f -size +100M #查找当前目录100M以上的文件
* {( C# ?6 I' \- }2.对查找结果按照文件大小做一个排序/ A8 E1 J j# r5 |% }4 w
9 o" L- ^' t# f; P+ {
find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr# c# s3 M0 u% z5 \+ P3 L
2.1查看当前目录下某个类型的文件或数量4 Z( ?) |1 J4 ]7 v) p" A
9 }6 C" [8 c% x8 \" W
find . -type f -print | grep php! h7 D6 f3 _3 ` [( G. p
find . -type f -print | grep php | wc -l
i4 c4 O0 v6 G, ~1 d% d. T3.查找当前目录下前20的大目录
g& H' R0 m" k. I6 _' A" C2 h( ?* r. W0 V5 g# E% ?( a- |7 r
du -hm --max-depth=2 | sort -nr | head -20
3 m Z- O9 M2 C* {* R/ K# ?+ y. l*这个命令我常用,先列出20来个大占用的文件夹,一一击破;3 e( T2 W l6 E% @% ^& w& G
- E+ U" b( n, G! H% @5 u
4.计算当前目录下所有图片大小,单位为MB;
7 X3 G: C6 S% |$ M3 e3 P7 D: x, l$ d4 p$ S8 p# H
du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
$ w. J& T' I( A( E; L重点清理项目- P7 P; _' O. t: K
Mysql 日志3 G3 g1 Z f% x, z2 l) l
手动清理日志文件* A2 P* H3 q- m3 W/ ~# }: x( u( K
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;2 d5 Q8 E( _7 _- \/ ]
8 _6 o q3 r; N" H& k
1.登陆进入mysql,并使用 show binary logs; 查看日志文件。+ {; X3 F$ A8 G. [ [9 g4 Z3 H
' j. n, }+ h0 ~, T$ kroot@localhost:/home/# mysql -u root -p- s" g7 g9 @( m' Y9 f8 }
Enter password: #输入数据库密码 Q r) {: c9 y# g/ c2 V
mysql> show binary logs;+ v7 ~2 g* s! X% f0 S; Z7 Y
+------------------+-----------+6 v. `" n0 g6 B8 S
| Log_name | File_size |0 ]/ n1 t; a. f Z; ~9 p
+------------------+-----------+
& ~2 j! C, T# s3 q: [: s; Z, U| mysql-bin.001368 | 3175578 |( X/ t7 o, @' {% N
| mysql-bin.001369 | 177599 |
: V, G, ]7 i- H1 X+ J/ z1 \+------------------+-----------+
: i& @, O. l1 s# j- J2 rows in set (0.00 sec)+ J* h" Y" ]/ v- J' N4 q
2.查看正在使用的日志文件:show master status;8 k: o" {# j3 [( \
8 ^$ r" s2 k+ v5 H' c! v# ^mysql> show master status;
+ `6 H6 @7 S8 m8 w, K! t+------------------+----------+--------------+------------------+" V+ S7 I3 |8 e! x
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
$ ]! E5 ?1 ~6 \3 k/ Y% n+------------------+----------+--------------+------------------+( F. g, H* M! H7 ]# p
| mysql-bin.001369 | 348563 | | |! s" N# K5 d* u7 {! G: r' C' n0 f( l1 t
+------------------+----------+--------------+------------------+
/ U; }" x. G" I% _1 m: L1 row in set (0.00 sec)8 v: A* t0 X2 `. [2 I* ~7 J2 q
如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;
% M$ T0 t) f( u: y0 @7 y6 |! F+ l# b3 \/ E
3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';
6 @" g+ V7 B" y- t+ }+ S7 V+ J6 U+ i, n5 R d. I
mysql> purge binary logs to 'mysql-bin.001369';
8 C6 {. @, @& P. L5 mQuery OK, 0 rows affected (0.02 sec): Y! O. A; ]; P
mysql> show binary logs;' q7 `# b: E" \" Q7 Z, ^9 ]
+------------------+-----------+
# W) t$ e! Y* ^( F4 C| Log_name | File_size |
3 y; P( t& a0 q) Y. ^" {+------------------+-----------+
: p+ o% E# v- m( \! {, _$ H| mysql-bin.001369 | 949552 |: i5 c8 e/ T2 T7 X
+------------------+-----------+0 l- i* y: L' @" Q* k- C. b6 U
1 row in set (0.00 sec)! z# F' O% q- ^ T3 L
删除完毕;
) p% S0 q6 R% u' {( U
0 \& d9 M& K3 R" O4 J定时清理日志文件& u& ~7 @; a3 k6 {0 m+ b
1.主理人自己已经设置其不产生日志;# J) \* p3 h) C' R( Y6 Q% `' |
2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);) Q! V; a' R6 `! D$ O+ A
8 m1 Q* @1 q+ m- Q! ]
mysql> exit
+ D% a/ \8 B0 c3 E- Y" ^3 ZBye# N2 O, b7 V$ @9 @% n0 V; z! W# ~
root@localhost:/home/# vim /etc/my.cnf4 m0 c1 ]- R+ O$ c& l# Z
编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;, G3 A! J7 @, ^# U0 P2 I
9 Z( J9 z, x7 w5 W. Plog-bin=mysql-bin1 x* \/ S5 X/ n% Y
binlog_format=mixed$ q& D7 `& f) G) f+ [" ]! u
server-id = 1
3 B- ^0 T7 `1 n2 E. s9 Qexpire_logs_days = 10, e3 z e' {+ J/ y- c) q- R3 u
改好,保存;重启 MySQL 即可;
! K7 a6 Q, I2 G! S# {
, @0 M0 o9 v, C' `root@localhost:/home/# lnmp mysql restart9 f* s8 \# e. ^' I- ^1 b
或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;
$ A6 c; @$ m7 X% ]& t# D' R% U5 s+ x, `; s
##注释 log-bin=mysql-bin
$ A) Y& a. v m; c; l7 M##注释 binlog_format=mixed2 W& d f5 m) q6 C6 m/ q! `0 a; O& v0 Y
参考1:Mysql 日志爆满,删除日志文件,定时清理日志0 E2 h, G* B/ E3 e7 y6 |/ {. a
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
- K" T3 Q$ Q) `( a4 F. Z4 z6 U3 N1 ~& V) ?. Z2 X4 ^
Nginx 日志
: J5 S, I- ]6 ?4 Y! f" V手动清理日志文件4 j* |. }2 J1 L/ V: \; w! v
nginx log;
) R$ t1 M# ]$ r7 a' [6 Y以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
- L4 Q/ [$ r# E; d8 X/ W. m' Y* L, C" r1 P
找到相关日志,直接使用命令 ls 查看有多少日志;; ^# k6 {% V8 o5 x. Z# {
, n/ D2 h L. m% _# i1 ]+ \root@localhost:/home/wwwlogs# ls
' Z+ o" t8 Q. y5 Qnginx_error.log* @: d6 I* u1 N2 `. k
GeoLiteCity.dat limbopro.com.log ' a/ V% m3 q R7 [' W6 S' g, W! Z
access.log
3 R. _% n+ R% x8 P' x1 o2 C* ~使用 > + 文件名 清理日志文件;- T/ H8 n* b! H! U& _
* s, z: G+ v: \4 v7 {( ~root@localhost:/home/wwwlogs# > limbopro.com.log
5 e* h; q9 e' Y) sroot@localhost:/home/wwwlogs# > access.log
+ G) [$ q- [1 Y- k4 j定时清理日志文件
" w) {. ?4 G7 z$ K+ u6 ]5 C使用 crontab 定时清理日志文件;( h/ Z$ C. u6 }% M1 Q6 F9 [, l
% a# w( a& q$ \& O! a( u
root@localhost:/home/wwwlogs# crontab -e! l' ]$ j+ j: Y$ Y# @
添加一条,设置每日凌晨零点自动清空日志:) [: u" Y1 ^7 ]- g6 s# ~6 h- Y
+ f" R- X2 J7 q: i7 r; l0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志% x2 o+ k( w9 y3 }' E1 A
0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志1 O2 s* f# M. T$ Q
保存,退出,重启 Crontab;2 x' h: h9 t2 G8 {9 S' F
; K" N3 a( z4 ?root@localhost:/home/wwwlogs# service cron restart
4 J7 q) H& T9 W# Vroot@localhost:/home/wwwlogs# service cron reload
: t/ v6 B9 v4 o6 H5 M+ y*日志文件具体位置,以实际为准;本方法比较粗暴;
2 Q% r, J3 m$ F/ I, K2 M; K) B. ]$ I' @! o9 q4 T! d: A
参考1:Linux crontab命令及其用法;5 R0 ^; N4 k2 ?; W1 |; ^. M/ V
; c, s4 T% H( M- |journalctl 日志清理
! k! W$ {+ b& u+ L* T( j配置文件路径: /etc/systemd/journald.conf;
- s. t5 A" l3 ?( @9 A1 `日志存放文件夹:/var/log/journal;
0 Q) b4 Z- @5 g- D% K' j4 o! n. D" }' X, G. a
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。
* s7 w0 ~' M- K$ p/ O4 P) ]! s3 h7 _; \
清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
7 i* W7 }- c) `! F; q
& V) b- Y# I8 {; g0 H) w! z9 |journalctl --vacuum-size=20M
7 r* N1 e" `& n' [: E7 S8 @ V* o! f系统日志清理% G* C5 `2 ` _6 ^. g; n" s
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。
1 {( [7 p9 J. ^6 P8 Z- B8 R8 m8 l
/ I' z% N" ^! R- Y0 Dsudo apt-get install ncdu# l6 Q; \, T0 V% S2 b
sudo ncdu /var/log #然后按i键* ]) z# g/ g9 \( Y4 _6 {( p8 v, V
ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help
U, Y' ^" D9 Z0 K--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
/ b0 L1 K& B0 L/ X5 s- U 48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ 6 L6 X" w7 t! g( t: w
16.9 MiB [### ] auth.log │ │
' U4 Q6 {6 \" ], y1 ^2 m 15.0 MiB [### ] redis_6379.log
- m U% j# b3 A...8 w. v8 X5 ?1 r$ z
然后进入 /var/log/) C) h- H5 [/ P3 E5 V8 D* H
: ^2 H5 G! Z3 h' f3 L2 qcd /var/log/# g- m- A, t/ D5 G3 n3 F
> redis_6379.log* U! }- T4 u( l1 T/ j9 z3 f
安装包清理
. b3 ?0 W* ]4 W查看安装包缓存大小
* R+ @1 G3 Y1 Z* y
+ ]" v4 v; f# K" H1 U8 i+ B( J: A- ]0 Ddu -sh /var/cache/apt/archives
/ w, z& y: x( M# A使用如下命令删除已经安装过的deb包
b1 q( S, j* S5 P% S# B9 ^+ R" d4 O! v; P$ Y1 ]6 b
sudo apt-get clean
2 `7 c( H$ M0 O' isudo apt-get autoclean
5 c2 n0 ~) k7 \, @" U1 v删除孤儿软件包 已经没有用处的依赖
* e& i$ W2 Y [6 E. L1 s- M( x/ C; g7 s. z- ? ~
sudo apt-get autoremove/ F2 S. |1 \1 f' b" e) E ^
清除手动安装的依赖包
$ A; ]6 r- n9 h h- |/ v+ D
8 i8 E% R9 O# o; g/ m" }deborphan- [' `" s5 Z, f
sudo apt-get install deborphan
6 K1 B# A, {9 e0 A4 C- Ddeborphan | xargs sudo apt-get purge -y
( R: Z6 X7 z5 a6 f, K) w删除大容量已安装软件包
6 v7 T p W% s首先安装debian-goodies" c' Z3 u' V. `& k6 g+ e
: p8 \. f& J7 K8 p
sudo apt-get install debian-goodies
" V+ m6 {! k" b2 T3 n; ?然后输入下面的命令* c! C9 W: d4 \* V
! ?6 @1 H' x9 Ddpigs -H) s v5 F' Q8 o3 _& a
我的输出结果
% Q) b" [* i2 ~9 a8 D9 x
) ^% r/ }7 n4 @ `! b. C5 s531.3M linux-firmware
9 l: B; u7 a6 d2 [315.0M fonts-noto-extra1 f, p2 l, ^6 s9 F! }' ^, C
282.0M libgl1-mesa-dri) Z O! b9 k4 t) N. Z
214.7M golang-1.13-go% I" w8 F/ y) z
212.9M linux-image-4.11.8-041108-generic% m6 I6 n3 j! u" Q v9 ~
181.1M linux-modules-extra-5.4.0-60-generic
& [/ w/ j0 v Y! E181.1M linux-modules-extra-5.4.0-59-generic7 l6 o8 F }$ x) S
181.1M linux-modules-extra-5.4.0-58-generic, O, N7 \6 i# A8 ?" I
166.2M docker-ce-cli
, g S: E. z6 L123.3M containerd.io6 ?) h. W, e3 H5 z! O
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个
2 ^7 G( T9 I. f6 S( y, K% U+ t- Y
6 ?, `& }: p. _9 a注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;1 s" u" F9 ?% v: ?# I
dpigs -H --lines=20
. O Y3 u% T Q% v/ \5 K软件包卸载命令+ z& j% ~5 h' {2 K
, v8 g! c# ^( Q4 Rapt-get purge #purge 后面接软件包名称) a3 u) U& L* F6 @! `6 |4 P( M
apt-get --purge remove #配置文件也清理掉 命令后面接软件包名称
Y4 w, a W, X }/ A& ?6 ^示范 以 删除 golang-1.13-go 软件包举例;
8 V( R9 A R5 U- `) t! n3 f5 I" y
# j2 @: V4 B: N1 {' `root@localhost:~# apt-get purge golang-1.13-go
$ y' R' e/ h4 A6 q2 T6 Z/ I3 I正在读取软件包列表... 完成
7 A! v. i S3 I9 p! l正在分析软件包的依赖关系树 _) }+ n) c: O& A" v$ M* e
正在读取状态信息... 完成 % Z; ~- r% R5 K {$ M! [5 `/ U
下列软件包是自动安装的并且现在不需要了:
8 }% m: R" g5 G golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src
! p' A: N" y0 h% \/ e使用'apt autoremove'来卸载它(它们)。4 U, {4 b+ [& d$ h# |
下列软件包将被【卸载】:
2 o: |4 T/ ^8 |' ~7 K G golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*& p) q6 t, D F) N& k
升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。
" I3 C R, y2 x. J9 u1 ^6 [2 _解压缩后将会空出 230 MB 的空间。% Y! m! K+ s- K, E. \; a
您希望继续执行吗? [Y/n] Y
& r/ P. @9 S2 M7 H$ R/ v$ r1 e/ q旧的内核清理1 E; p* f4 G; z& o$ G! L4 N& I
查看当前使用的内核
8 F9 A4 Q( h ~6 \. I% ~8 a! j/ M# V- p9 N# z' w1 o7 @5 J
$uname -r
8 C0 b7 t# E+ H5.4.0-60-generic; s* n: j. z! ~) M% a% C
$dpigs -H --lines=207 G* l+ r8 z7 _$ c$ g1 b J
74.1M linux-headers-4.14.91-bbrplus$ Z% U- C1 V. m& h8 @
70.0M linux-modules-5.4.0-60-generic //保留6 g' f8 q) L; N, j
70.0M linux-modules-5.4.0-59-generic //保留
9 o8 L) T+ z7 R...
2 [" O' g! c# Y% [! k V0 G看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);
0 O) `( Z# Z A" _2 |0 q
+ I3 {) _' a9 @1 r$apt purge linux-headers-4.14.91-bbrplus
8 ?$ ?9 d- |* l# y S- p' L运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):& _& Z |+ \; F$ q# U
% Q% i: M' {, W- y& g
$update-grub
3 B% |0 Q0 S" j4 F4 I% W0 b- TSourcing file `/etc/default/grub'
! j8 C1 _' m1 B% ZSourcing file `/etc/default/grub.d/init-select.cfg', p% c. Y5 Y% z- \& ~: Y3 J) u
正在生成 grub 配置文件 ...) T: `0 x. s) L4 E' |2 O. ?5 K9 h8 ?
找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在
9 A" H& R/ |9 }找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic5 l/ T5 G8 t+ \3 s3 b7 V+ m$ K
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic8 ?; g) J! F& M" f3 D* S
找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
- O9 n, r: p0 C$ a. r找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic* p7 R V$ o1 D" d7 q$ G; x
找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic, x! E* g8 t: v; ~- W+ T; ?
完成
* h, G A* m) A9 S9 S) {...! v3 T9 N: ^: t, e
, R4 r) K) I1 t V1 G相关知识
, j5 m% U; f# d: f& ~LINUX的磁盘管理du命令详解
N3 m. k7 t5 l& d n( y9 _4 w7 ~; W& M) e2 a: }/ \# @8 s
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。+ `7 Z; g; o+ e. ~4 k2 p. Z
9 y& G, g+ ~) s P/ wDU命令用途
1 ~, @0 ~/ L3 c. K& d2 Mdu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
7 }& F; N t/ i" E$ s8 M1 I* @: T: }9 z5 {
找出大文件5 ^( v- D) M/ _) f# V5 o
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:/ i' Z2 F \6 w% X, ]6 n; O* A
7 E2 {* R5 T; D! C# s' R8 Z- adu -s /home/* | sort -nr #/home目录检测
+ b0 d! `% v$ a! T2 ~; W, t# ~) A0 H& X1 R' {5 e3 a! \
|