|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)) {8 J/ q. [. S$ m+ T1 a: K
& H7 K, D# r8 U* O本文章实用性说明
+ {, Z8 k$ D$ k, P1.检测Linux服务器的磁盘文件大小;1 W' C y6 Q" D" f
2.重点清理项目;
/ b4 P% t* S! j# ~3 M' k4 i
6 v2 a$ c9 H; _7 x s+ w2 n: i5 I实用命令
! p# Q5 N8 h! g" h0.查看硬盘剩余空间5 a# Z4 [1 K" w1 j$ [ b
* n2 m( \1 A2 X( ~$ U z
$ df -h #查看当前硬盘剩余空间并以GB单位表示
1 A5 g# Z1 F6 b4 Z9 B& X文件系统 容量 已用 可用 已用% 挂载点
( f6 ~- P- y8 J( `udev 448M 4.0K 448M 1% /dev
0 H5 D2 y1 i5 y; i$ htmpfs 99M 1.1M 98M 2% /run
" c! Y1 J- o9 D4 x/ J/dev/sda 25G 13G 9.9G 57% /
! D4 N; w9 U+ _tmpfs 491M 0 491M 0% /dev/shm2 Z( c% {; c- W; f
tmpfs 5.0M 0 5.0M 0% /run/lock& i& k9 b1 |2 O7 F4 }
tmpfs 491M 0 491M 0% /sys/fs/cgroup; z- H; \! } T% ?" u ` j, d6 g
tmpfs 99M 0 99M 0% /run/user/0
; S4 ]+ e& l- r) [1.查找大文件, ~6 [8 x+ _9 v C6 T
! n0 P3 T) e wfind . -type f -size +100M #查找当前目录100M以上的文件
2 L& M+ W. T8 }# ]1 b$ g# T8 a2.对查找结果按照文件大小做一个排序
2 W* A. C3 C$ t7 O0 c$ f( _) U
# K7 i! |; D8 r/ x$ D: ]find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr; t) \+ B' h# E5 _5 ~- ^0 m2 s" N
2.1查看当前目录下某个类型的文件或数量
& p) [" C/ n, x$ r' U- X) l& p2 D9 T/ e* g. W: Q4 f: T
find . -type f -print | grep php
c+ `) f" I- s5 Vfind . -type f -print | grep php | wc -l3 j4 U1 [1 N/ U# c
3.查找当前目录下前20的大目录! M4 W5 z1 N8 ` ?- X* z4 a8 a& h
0 Q! n1 R) z# @& w: A! r. ndu -hm --max-depth=2 | sort -nr | head -20/ S* Z: w& V4 c5 H
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;
+ R( j0 g. r0 d9 y( c2 P8 _ s, `# x4 ~2 C* ?
4.计算当前目录下所有图片大小,单位为MB;
# P' n" } {8 \! y
9 j' D6 G9 K* R& {& n7 E( udu -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
0 H8 f$ O- B o4 P重点清理项目. x3 R+ c$ |; Y! w, _) W: @
Mysql 日志& o6 \# e* r4 }5 ]- O$ \: H
手动清理日志文件9 ?" j% D3 R% m- [
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
% R, o3 {: R- O! i T
9 g! m. I. T( K r+ o& r, {1.登陆进入mysql,并使用 show binary logs; 查看日志文件。1 f- f7 Q$ ?" {5 x. s
7 E8 m; [1 l0 Z0 Broot@localhost:/home/# mysql -u root -p1 Y9 }7 U0 S& Q" l: D
Enter password: #输入数据库密码
) D: S0 `. i1 Lmysql> show binary logs;
# ~9 f, I* e0 Y+------------------+-----------+# Y J- X4 @4 |, r `
| Log_name | File_size |9 o! A S E8 |) e+ p- I( j: {3 R) G
+------------------+-----------+
& M' G# l) O3 C8 A- t, o e4 d( N| mysql-bin.001368 | 3175578 |$ [( _! l# _- C: d: S ~
| mysql-bin.001369 | 177599 |! U- A% D1 m% o/ H0 f+ Z2 D
+------------------+-----------+4 _; q7 o) o3 \& Y
2 rows in set (0.00 sec)/ f6 `' R0 k, y1 r/ N# c
2.查看正在使用的日志文件:show master status;$ D3 ] H' d1 I6 w/ a
$ s q4 i5 U+ j3 T0 F/ e+ J
mysql> show master status;; H) w7 r1 I+ r- T+ U# b
+------------------+----------+--------------+------------------+
\5 v$ w: v7 e# J, Z7 c: G; S! z| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
* t% g1 q% c# a/ a5 E- J F$ ~5 U+------------------+----------+--------------+------------------+" l# x( V/ @5 i% I0 }) D9 m6 m
| mysql-bin.001369 | 348563 | | |
4 i: x3 H: r8 R' Z8 z- M3 k+------------------+----------+--------------+------------------+' i9 Y9 w7 _& ^/ ?; t4 G
1 row in set (0.00 sec)
' a, |& h+ D1 j$ q! R; ?, P! y+ R如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;& K0 x; D- x! _# [7 N8 a2 h
@, v$ e: X6 s! T8 C* p0 K2 B- t- p
3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';
+ Z. }& V$ t" Z( Q# u7 I2 H1 u! }+ V, ~: t5 m/ N
mysql> purge binary logs to 'mysql-bin.001369';, I+ K, A; B- s* O
Query OK, 0 rows affected (0.02 sec)
) s% a* Y& Z" }6 o ` hmysql> show binary logs;
8 z! K, e7 O2 v- @+------------------+-----------+8 f( x& c8 Q$ R, i2 c* z/ T# Z
| Log_name | File_size |
7 D6 t+ ]( x- W$ h: C' |& |! N+------------------+-----------+# X! n1 z0 Y' g
| mysql-bin.001369 | 949552 |
) ^' _5 |. W1 y5 b$ {* \( w" V1 W( D, @+------------------+-----------+
9 {3 W: o) M* m4 D; M: O: y1 row in set (0.00 sec)$ m" \8 ?0 R3 W$ t
删除完毕;! j% f3 c8 V$ Z( d4 D7 a# o: h2 I$ }
# m4 Z& B, A1 ^# u
定时清理日志文件
- p6 i# F: G: ~! ~1.主理人自己已经设置其不产生日志;
; N& A6 i" e9 n0 j2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
$ v0 O# n3 r$ W1 x( k( z0 x; n8 W# d& n! |0 x* D5 N. @( ]: \2 {: e: s' Z( q
mysql> exit
- |4 a# \: x0 l9 ?+ _. R, w: i8 fBye* H, {# C1 W% W! Z: o1 C
root@localhost:/home/# vim /etc/my.cnf! m* X- i) t( i# N( X: n: a
编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;- Z) W7 j6 X9 v6 n: A: J
6 b2 }3 ^& R! Z
log-bin=mysql-bin
n- F* h- J+ b* cbinlog_format=mixed
a+ L* r: w6 T! C6 pserver-id = 1- @, E1 m6 ]( e7 U1 F& e
expire_logs_days = 105 R% Q2 l& D( c6 w( N
改好,保存;重启 MySQL 即可;: G) Z& X0 M1 d1 j
1 ]- @, S4 s9 g( Z" ~' O
root@localhost:/home/# lnmp mysql restart
5 c: ^" y0 N0 `; a或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;0 x! L8 L! l: a% a' Z) c/ w
+ I, @% E3 O2 v( b$ {0 l1 h
##注释 log-bin=mysql-bin' R( a1 W7 ?- G, d7 I6 |* _) r
##注释 binlog_format=mixed! p' u& B0 W2 b% t% v% e) c7 ]. i
参考1:Mysql 日志爆满,删除日志文件,定时清理日志1 W1 ^- @* F( |
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录0 t6 C5 J. s0 p, k+ K0 H" J
# R8 A: L, ]5 y+ i5 n8 S
Nginx 日志
5 t( G9 I0 B# B* I7 H: w手动清理日志文件3 n* r6 O: S1 H5 U8 G9 j2 ^4 ~! c
nginx log;
; @' O: M0 q) P; O2 c( v% s以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
8 j" F" n- _) |- a8 a) S
5 s% _6 a% [, f" P. O9 e* S# ]# \找到相关日志,直接使用命令 ls 查看有多少日志; [/ [7 I% u; f$ L1 v0 N, S# f' H
j$ e4 h% b3 J% v0 Lroot@localhost:/home/wwwlogs# ls
& d* i1 Q- {4 e1 anginx_error.log
! D& D8 u3 ?! J/ t$ i9 SGeoLiteCity.dat limbopro.com.log
! ]9 d4 M- y# `5 U& T4 ]4 e& Faccess.log - u. [+ h; p9 l6 o! ]
使用 > + 文件名 清理日志文件;+ x/ C# y% Y# F7 e6 d9 S, Y
( N) }$ s# u( ]: \6 Broot@localhost:/home/wwwlogs# > limbopro.com.log: t8 i+ F8 c/ z
root@localhost:/home/wwwlogs# > access.log
@0 @6 E5 r/ p" q7 O0 u! j定时清理日志文件. O, z0 n" \/ J2 N8 I+ W
使用 crontab 定时清理日志文件;
5 l. k' F6 d! o
4 T+ J1 S. O! O, W7 C1 P* broot@localhost:/home/wwwlogs# crontab -e
2 L4 W. ], u4 } ^) j3 X" {添加一条,设置每日凌晨零点自动清空日志:
2 }& B8 c$ e' `, K4 z3 ]8 K; E8 B* w/ M2 ]3 J
0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志
6 C0 v; x9 J) R7 |# t7 `0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志
, v7 I4 B9 k8 [- h \+ [6 J+ u保存,退出,重启 Crontab;# E, X# m2 }1 c# u4 H; S' V X
. _+ r. n- O% m1 Z( f% h
root@localhost:/home/wwwlogs# service cron restart
4 b) x- Q) i3 m; Mroot@localhost:/home/wwwlogs# service cron reload: t7 z6 v8 P: w
*日志文件具体位置,以实际为准;本方法比较粗暴;: o2 L; ~9 D) U% j l/ j
$ O- C1 B& n, u8 u# Y参考1:Linux crontab命令及其用法;! ?0 |) L; V2 D% S% H
0 ^; v1 x* E& Jjournalctl 日志清理& I3 U- _( G1 `
配置文件路径: /etc/systemd/journald.conf;8 ]! U% S y$ F5 a5 w/ k
日志存放文件夹:/var/log/journal;
# u6 P# R$ u' d) @8 U. d$ a/ d
. c2 t% d" s& p% d' [% O9 ^systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。" u& m: O' C) |# o5 h1 F* u
$ O. m. O. ~- K8 r x; B清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
# l1 Q9 Q1 D7 ~ b# W, Z
! Q& G j9 V4 b9 Kjournalctl --vacuum-size=20M! |, ], W1 g+ L U. p
系统日志清理
6 k, v3 F2 J* |' Z* a2 ?& j系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。
Q$ P' \% x7 m7 a9 S: [; V
- T/ _& G! g4 @' B: Vsudo apt-get install ncdu% |0 I f! U) t5 {- D: ~
sudo ncdu /var/log #然后按i键
1 k' r9 U# Y$ A1 kncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help ; {0 {2 m* C1 @
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ K( o! L9 b; W5 u/ ]" D
48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ 0 ~# u6 [0 d& }; r5 |
16.9 MiB [### ] auth.log │ │2 w2 q# `' O C4 d x
15.0 MiB [### ] redis_6379.log : w4 H. z+ C& S/ M
...
5 U' `( k6 Y: z. N+ D2 E然后进入 /var/log/
9 U1 v7 H) |4 {% x7 l. ^% S3 ~4 y$ i [, r! m9 h ]" Q
cd /var/log/
' g5 g; Y8 d+ w; r' C> redis_6379.log
5 j$ W* }) R8 e A7 t* ]安装包清理
( ]( t" c4 v/ g4 u查看安装包缓存大小3 f1 M* [* U& R4 a' b N$ U# F/ i, P
! T1 o* C. C" y0 M |0 {
du -sh /var/cache/apt/archives
' P8 G4 e* B3 }) e8 y使用如下命令删除已经安装过的deb包0 {, ?7 \7 `/ H4 X+ S, R* x% k, W( g
% _; S' s q' q, C) ? qsudo apt-get clean9 ^+ G* B( L4 }2 ^& w4 m
sudo apt-get autoclean1 ]. |. n! D& L# h9 `7 {3 F9 h' |5 e
删除孤儿软件包 已经没有用处的依赖
' i8 v: Z4 ]- W3 o* M1 n c9 r4 M8 k! F+ O1 e
sudo apt-get autoremove. f$ F/ G3 H1 z1 t
清除手动安装的依赖包
% u+ a" j; o; M5 ], Q
7 ~# Y+ O' o6 F$ Q' n0 zdeborphan- ~" }* Z4 e6 @7 b; D! }' \
sudo apt-get install deborphan5 y. z! b/ q( c% R4 G6 d+ B
deborphan | xargs sudo apt-get purge -y+ r4 S+ U: s" }$ h/ S6 F/ x
删除大容量已安装软件包5 Y5 K- D2 i5 X3 \/ e+ j w
首先安装debian-goodies9 b5 U" {9 E1 H9 B6 N W
- P) A, X. f( ]5 w! ?0 X
sudo apt-get install debian-goodies# L9 G* Q; ~3 [3 A+ ~5 w2 ]
然后输入下面的命令/ D; L8 W1 ]6 ]. D5 h+ B! M
9 D7 K9 ]0 W4 H1 fdpigs -H
: w! ~* X* ?, c我的输出结果) R6 }: h3 C' Y
" U1 b2 X& K& S0 [" V$ {+ c* T
531.3M linux-firmware
! P5 y% W9 M X: ]315.0M fonts-noto-extra" L" c- r9 | X4 R+ `, o
282.0M libgl1-mesa-dri
* K; r0 `# y* a; E( s214.7M golang-1.13-go" d K# |! h8 C L$ a8 R+ w7 f6 r
212.9M linux-image-4.11.8-041108-generic/ ^# h4 c6 I$ A% C, |& h8 L
181.1M linux-modules-extra-5.4.0-60-generic. [, n! g7 N8 L; x1 Q- z l
181.1M linux-modules-extra-5.4.0-59-generic4 m' F. m5 r1 b }6 B
181.1M linux-modules-extra-5.4.0-58-generic' I" N9 L# E5 ` |5 s Z/ o# p/ Z
166.2M docker-ce-cli
. [& c5 S) E$ m5 H6 T: U% @123.3M containerd.io2 [" Q; c7 w( K$ `/ O
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个2 e$ ]' D' q4 K
5 H$ M0 ~& ]. e6 R注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;
1 h. o: h0 @. f7 R* s' pdpigs -H --lines=20
9 r9 O$ r/ O# }软件包卸载命令' r5 s. Z/ W k' i5 c. W- h) w
9 E. s0 t* M2 x" G7 ^( S& n; l* \
apt-get purge #purge 后面接软件包名称' g$ z# x/ u8 p2 S6 o8 c3 Z
apt-get --purge remove #配置文件也清理掉 命令后面接软件包名称% g$ F8 w0 _0 N$ W; G" I
示范 以 删除 golang-1.13-go 软件包举例;
4 T7 u4 W% p$ X. Q0 V# i2 y0 A' [! E9 m
root@localhost:~# apt-get purge golang-1.13-go6 C, u8 x( H/ A, n0 }3 [# A q
正在读取软件包列表... 完成' m( A, T( |" L
正在分析软件包的依赖关系树
4 H, m6 K; T# l5 c& _1 m正在读取状态信息... 完成 7 G: L4 Q) _4 d
下列软件包是自动安装的并且现在不需要了:1 A% ~4 \( v2 w% b Y7 M9 ]. w
golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src
: r" P l8 q9 g& Y' t使用'apt autoremove'来卸载它(它们)。
* c( P" K5 x& h/ j4 V1 {下列软件包将被【卸载】:4 f' W; z3 p- I3 h* T; W$ `" t
golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*
$ Z9 c$ @9 ?6 i' n- B升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。
o; M+ M8 a& o1 b( f解压缩后将会空出 230 MB 的空间。9 K2 b2 `7 r4 d7 g, o- P- [! B c- G
您希望继续执行吗? [Y/n] Y
) V) L6 L2 R5 r9 L: D2 t: y旧的内核清理
& ^1 f8 O1 a& K/ A查看当前使用的内核8 q V0 S x0 t; Z! ^* ?
+ k, j/ a: q C
$uname -r$ I# y# M0 }$ V8 J9 p
5.4.0-60-generic F w* F! J1 P% G2 b4 ]8 T- u0 e
$dpigs -H --lines=20
* ^, n. @7 N7 I- X" a7 B7 u74.1M linux-headers-4.14.91-bbrplus
5 E6 f9 v, \+ [9 J6 N70.0M linux-modules-5.4.0-60-generic //保留
+ e. C1 G$ X7 U7 {% p7 {70.0M linux-modules-5.4.0-59-generic //保留
8 J( n; E! U6 H' j0 m" @...
6 f1 N& y' r5 n; ]- \2 p- C" z看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);5 b& e% {- p) @' d/ y. K# g
3 `5 X. h- a; a$apt purge linux-headers-4.14.91-bbrplus
0 Q |: o6 f; K9 e运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):
- g2 H# t3 P' t' r! {; ?* J# J8 m2 T3 W( x" M3 {& F5 U. G+ g
$update-grub" c* `) l+ v K$ a, v
Sourcing file `/etc/default/grub'
0 A+ }6 N, [9 [2 y/ }# nSourcing file `/etc/default/grub.d/init-select.cfg'! ~1 N% N/ Z" `
正在生成 grub 配置文件 ...3 K$ l$ I4 f% `7 v, Y- }0 K
找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在
! z2 Q5 |1 q# N/ \! G' O r& |找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic6 a. i' N I( j
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic
: G( A; o2 s7 a# p3 L- O' Q找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic% z4 m1 r8 s0 B! {
找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
, u" P7 u3 E) F: [- g6 ~找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
4 \% p% K* h0 a' X. E; D: j: M完成
, O3 R1 R9 y/ D, A" k# N" V...0 `. n5 e: d! M; Y+ {5 G
/ }/ F, G6 d" B, B, I8 j; Z相关知识- |/ e0 t# V7 v' ^' @5 L! T
LINUX的磁盘管理du命令详解4 R- ^7 _7 b# o1 {+ s I' |
1 E* m3 B) T$ y. e/ A/ w
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。4 T* S; T' s P: D' x
+ j- C0 a& T& n u# sDU命令用途
* F: C. b% C w( f7 g d0 Ndu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
+ D' _1 y$ j y* [( _- k" Z# a
% ^& A- u" |: O8 u* g( r8 M% E; N找出大文件
+ e* g" L2 ]& V, q9 k( Q磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
; v( K' t/ A1 b
& e- l. Q6 q/ ]7 o0 odu -s /home/* | sort -nr #/home目录检测
# I7 s; M4 U- L9 ?# G: m" M% e+ X9 v. A. i) j- S
|