|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)
( F+ c1 Q3 ]7 }1 l. L; Y: _' g
) A; b. F9 I3 j+ @本文章实用性说明9 f b/ v! i# T) C" C k
1.检测Linux服务器的磁盘文件大小;
0 L3 C, r3 W( T0 Y2.重点清理项目;
+ j" s3 F. A1 J) I9 H
) U* T4 X" m# N3 ]% b6 J; k# ?实用命令& @) E# l0 |- z5 x
0.查看硬盘剩余空间* N* b% i( G1 T8 M( h, {, J5 k" G
+ `/ ]7 `- C% u" I$ df -h #查看当前硬盘剩余空间并以GB单位表示
8 D, O, t1 H7 q文件系统 容量 已用 可用 已用% 挂载点6 {. L# H/ H) R! k8 ~0 Q; c
udev 448M 4.0K 448M 1% /dev0 E e) A; Z0 D
tmpfs 99M 1.1M 98M 2% /run& E5 z! \0 P8 k3 o9 W1 o) @; w
/dev/sda 25G 13G 9.9G 57% /
$ y( |8 W1 i* b7 `6 t4 ?' a4 }; i" Otmpfs 491M 0 491M 0% /dev/shm
, w/ ?3 q( E/ h3 S3 y1 [% Ztmpfs 5.0M 0 5.0M 0% /run/lock0 X* m- R' I, N# N; r
tmpfs 491M 0 491M 0% /sys/fs/cgroup
3 S. {$ ?' X) E; }! [% @tmpfs 99M 0 99M 0% /run/user/0
& ~$ P1 |" d0 w1.查找大文件
( R$ _1 c0 ]4 J3 e0 V1 ^/ O5 e0 v7 V; Y0 ?% i+ J
find . -type f -size +100M #查找当前目录100M以上的文件
z( q5 ]# i7 V5 h! V# y& m5 }2.对查找结果按照文件大小做一个排序
4 [1 I9 y2 M* t
' D8 w9 V( y4 i5 {5 `7 ?find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr
# g7 ~( P3 F' W+ P* D2.1查看当前目录下某个类型的文件或数量4 P$ o" m2 V9 M* T% j
5 j6 ^& M4 J N5 G0 n
find . -type f -print | grep php
6 T" m& G8 [3 N' S, Xfind . -type f -print | grep php | wc -l( `1 b3 p e& J; U9 P2 t
3.查找当前目录下前20的大目录: p# S0 q1 J4 ^. C }- X- Q' t
T2 u' e% i3 Ldu -hm --max-depth=2 | sort -nr | head -20
9 u. R# X6 ^/ E" T: r- K*这个命令我常用,先列出20来个大占用的文件夹,一一击破;
) ^$ t/ k6 [, a: `8 f$ J" G( N% d0 q) n4 r# D/ \
4.计算当前目录下所有图片大小,单位为MB;
% e1 i! \" e( O1 x/ ^5 f+ \2 t7 ]$ F. t2 {' ~% y2 X! \6 Y
du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
4 g/ H# S- i( M9 H5 l6 a7 J* X1 C5 @0 ~重点清理项目1 L R6 `1 h; ^
Mysql 日志7 o" Y! G H$ _& v1 w" F9 \
手动清理日志文件) N% D6 R5 s5 L- Q) ?6 V
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
; G8 t/ R8 @( Z9 S1 }, Q/ |- M8 \: Q$ u" x, w8 S- W8 V
1.登陆进入mysql,并使用 show binary logs; 查看日志文件。& @3 X3 v6 W+ R7 x" V7 _
* j$ @, P8 l5 t9 Z1 x2 qroot@localhost:/home/# mysql -u root -p
/ G& z; ~7 I: G1 ~( ]Enter password: #输入数据库密码/ r$ N( z# J _$ V+ k- h
mysql> show binary logs;
, Y Z3 Q" O" k8 {' d# R+------------------+-----------+
+ b9 L; K- a$ _9 m| Log_name | File_size |
6 [; [8 O* w# @5 B' {+------------------+-----------+
. a1 h/ y# P' _2 y| mysql-bin.001368 | 3175578 |, g2 r! l- a! P3 J! j
| mysql-bin.001369 | 177599 |
; W6 c, y. i* x7 t+ P& p' x; B! c+------------------+-----------+
: Q- |& l6 T3 W* n1 q% @0 _7 I: m1 U2 rows in set (0.00 sec)
7 N! l: l" w+ @) m2.查看正在使用的日志文件:show master status;1 Y' \9 |* { d. ?, ~, }$ P$ L
0 h+ s8 z. R- x/ J) wmysql> show master status;2 p4 q" C1 y! T9 X6 U
+------------------+----------+--------------+------------------+
5 t7 C$ [( u' |' ]/ c& n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
* c# F* ?& F: Z& v- D+ x8 l+------------------+----------+--------------+------------------++ i& U$ R. j4 l% S# w
| mysql-bin.001369 | 348563 | | |
0 Y! k( k; ~ V- M9 W- U6 r+------------------+----------+--------------+------------------+8 x& y& n+ m3 k- O5 I
1 row in set (0.00 sec)
8 i# D3 N% S: e, W如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;
- T9 c( ^. a6 i# v# y
# }6 G$ D6 o3 x- N3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';7 C8 B. R" V& G: H. R) F, X9 Y
1 }, `' z/ e" G; H: l" i6 o4 n
mysql> purge binary logs to 'mysql-bin.001369';
* j' D' U& E/ bQuery OK, 0 rows affected (0.02 sec)
: J9 D' o9 R" t4 O5 O. Pmysql> show binary logs;( Y% O, n+ N! X
+------------------+-----------+6 `3 r; z- m( X5 f. m, J9 {4 _
| Log_name | File_size |
9 E3 L$ J9 o' M- u! l+------------------+-----------+
7 O( F6 U y& s" A8 s$ W& n| mysql-bin.001369 | 949552 |
} B+ H, I& a% Y6 t4 {+------------------+-----------+
* {3 V; N0 v4 A7 z' Z" p1 row in set (0.00 sec)
6 [# s. [% ~) L' g- a删除完毕;% @3 b% I3 K, n1 q8 H8 r4 ]
% N9 r/ ]+ R, U# U" j定时清理日志文件
+ l- I' d8 K4 z5 D) w1.主理人自己已经设置其不产生日志;. C& E, M% h2 P' c1 w
2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
% p; \" E+ u, r( z* V8 q5 T$ o% l+ g( T: Z9 m7 w; U
mysql> exit# O) I; p+ K$ R- |8 I
Bye
& y" {- j2 O; \root@localhost:/home/# vim /etc/my.cnf
9 g ?1 z& O! M! n" w3 T0 C编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;
7 a6 W* N# A0 [% O' Q$ I
7 X9 r* b; T/ c8 hlog-bin=mysql-bin
0 O3 r2 T: |1 ]- L) _( M8 Wbinlog_format=mixed
: q, I- N! N. U, vserver-id = 1
9 c& W7 c) K5 W4 g0 ~3 d5 k/ ^' L! ~expire_logs_days = 104 X; l: Q) `0 Y. n
改好,保存;重启 MySQL 即可; Z* o: e `* Q% g! A
8 u& E2 ~8 p s0 g C- ^) yroot@localhost:/home/# lnmp mysql restart0 ?% F" k1 N+ i& R# E8 k6 O2 v) x% P% G
或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;
4 {- M' B- P# J2 S
. Q# c9 m. c' ]& q6 V: ~- b##注释 log-bin=mysql-bin) ?, o0 n. M1 L" P8 U8 A
##注释 binlog_format=mixed
! h% |* x7 s. B+ x# e参考1:Mysql 日志爆满,删除日志文件,定时清理日志+ M1 W4 \% Z7 B6 U
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
) A0 f6 }! E$ }- q8 h
a8 c0 X' C6 l. NNginx 日志- P! ~. R6 N, T2 l7 S
手动清理日志文件! S, ?2 b4 l& o5 h3 t# d
nginx log;0 V0 J; J+ T. y; Z& r
以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
& B& W! O( G% X- ^
" h. a/ n, A) s# N [9 L找到相关日志,直接使用命令 ls 查看有多少日志;1 G" y& k! v9 A* \0 i
4 w7 i$ l6 |" a. L8 \root@localhost:/home/wwwlogs# ls
; `& H. D7 U1 ?! Y: h7 Enginx_error.log& u B0 l- x! K# x7 L% F4 \, M
GeoLiteCity.dat limbopro.com.log
$ F, } x0 k2 }" l( u$ |+ A: eaccess.log
+ k0 D r+ `- k! `2 P5 l! p使用 > + 文件名 清理日志文件;" T6 I9 n: `; O& o0 o
9 t( W) d9 M8 P" l
root@localhost:/home/wwwlogs# > limbopro.com.log# Y5 s3 a) L7 q) l/ n6 V9 L6 F
root@localhost:/home/wwwlogs# > access.log ) c5 a" n( K0 X5 y3 p! Q0 l0 k3 G
定时清理日志文件" B4 B8 m. E% B2 q
使用 crontab 定时清理日志文件;8 @1 X w- o0 n7 |# z8 ~6 E
! _- R5 W& s" Y$ f
root@localhost:/home/wwwlogs# crontab -e
4 d# g& c; h* P: U3 T$ d9 S4 m添加一条,设置每日凌晨零点自动清空日志:6 z2 }3 ?1 M/ v1 I: e0 B9 z
: f- N8 z B* u0 h& o+ d9 U5 j0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志
# a8 [ K; {+ d" Q V; F, Z' I& w8 D0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志
# K4 x: C9 E i; X4 N保存,退出,重启 Crontab;) A- J; \& i" b8 i# i! c6 W& a: e# o
7 W k; S* q9 _+ x' `. T6 O( H$ croot@localhost:/home/wwwlogs# service cron restart
+ |5 f7 L( j$ i; R' H1 A. Nroot@localhost:/home/wwwlogs# service cron reload1 g- V; N6 k. A/ T
*日志文件具体位置,以实际为准;本方法比较粗暴;
, C# r( ~& B2 L$ B
; d; S2 @$ T8 e参考1:Linux crontab命令及其用法;9 O& P3 F( C. l% M2 ]; U' p$ F/ P
" G$ j* o5 b' j9 njournalctl 日志清理
5 O' z. k% _. g/ I5 q" T配置文件路径: /etc/systemd/journald.conf;
0 |& Q$ n) c2 r4 v* \9 {6 P0 A8 H B日志存放文件夹:/var/log/journal;
5 y; w* U: ^; r7 t L. e. S1 m$ }+ a7 D* {
systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。
/ k1 ~0 ]- ~2 c' K) C
7 ?% p4 e3 P! o8 o2 r清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
/ p0 [2 c# Y, H
3 l1 m/ ]9 n) ^5 X: L3 E$ Mjournalctl --vacuum-size=20M
X+ x: N3 M3 F" d/ a! v% Y) q系统日志清理" L: W4 Q6 {( B G! Y9 c8 \
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。0 Y6 \( B7 V5 ?6 |/ d' ]. [
% s* N' }# _0 e1 Fsudo apt-get install ncdu
/ b% [. ]+ I5 _1 [8 y7 t, C' Qsudo ncdu /var/log #然后按i键7 s3 p6 {' e4 o( ]& W5 m
ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help
0 E6 E4 U8 W: O! t$ {) M--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
! f+ {6 P8 s& Q8 i9 F 48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ ! }# t' A0 }/ G$ E- S6 A
16.9 MiB [### ] auth.log │ │
/ p- L' r/ R" } 15.0 MiB [### ] redis_6379.log
' r b$ }1 h% t7 Z/ \$ S( k...
2 V K, }( S# R E3 G; O3 _$ }# j然后进入 /var/log/5 @! t7 u3 h& l+ B
9 i' n9 n6 d& @$ V4 ^
cd /var/log/% m8 ?5 X/ e9 Z" ^7 b; ]
> redis_6379.log$ K3 x' ]7 I8 L* n; z/ H$ |
安装包清理
0 j% m' L3 l2 R2 ?# ~5 b' h4 H查看安装包缓存大小
7 Y) N6 Q0 l: Y2 p F4 f( c- l1 O, G! O2 R+ [2 B( J
du -sh /var/cache/apt/archives) h+ L# s; [ u, A
使用如下命令删除已经安装过的deb包; M+ Z! s8 Q7 t
* @% _5 B2 P0 bsudo apt-get clean% r) n: T- u7 g6 Q- H
sudo apt-get autoclean
8 D' m7 W6 C/ j! h$ _8 c2 ~删除孤儿软件包 已经没有用处的依赖" H h) a5 h$ E2 P, r6 b) H3 f
' D+ v P1 S4 G0 R: a
sudo apt-get autoremove
3 w5 i( [1 Q% ^/ i+ z6 f清除手动安装的依赖包* R5 N: g- | g$ Y5 N, Q1 _
( M( }4 t( N$ Z5 ^+ K& }; Y9 \- W" R9 Q
deborphan5 p8 [$ x0 q: W9 I7 a
sudo apt-get install deborphan
) X5 T0 J! D' o# odeborphan | xargs sudo apt-get purge -y
0 @% ^" b8 l$ n% ]0 B# V删除大容量已安装软件包
! s( `) J- `0 [首先安装debian-goodies) ]% w, ^& B* `# J2 ]2 L. o2 E2 j
+ a- ?* J$ ^/ v a1 R
sudo apt-get install debian-goodies
9 ?' }9 W N0 v然后输入下面的命令& G/ j+ ?' w; z/ O* [$ _
& X3 p2 N" U$ z
dpigs -H
: k5 y( R- M6 [$ X: @我的输出结果
3 J9 C/ H$ T1 P6 m
9 U9 { x/ s4 g, b531.3M linux-firmware: J. n9 r& O# u4 P$ W" s7 l
315.0M fonts-noto-extra) X2 u3 l6 a' v
282.0M libgl1-mesa-dri, G0 ~& k2 G3 K! Q
214.7M golang-1.13-go
. @2 D9 z1 m, q# `2 H2 P. K( X212.9M linux-image-4.11.8-041108-generic
% }$ U3 X" t5 `5 K. a1 P7 y181.1M linux-modules-extra-5.4.0-60-generic
9 p5 s6 ~: q. L0 B. O Y181.1M linux-modules-extra-5.4.0-59-generic
( u, C" j5 R- K( B2 j2 J! \181.1M linux-modules-extra-5.4.0-58-generic# A: [: n! ^/ M; }; Y% c/ W
166.2M docker-ce-cli
( H: I# F' X1 ]7 }. ]123.3M containerd.io
r" C, P4 E3 ]上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个9 B. ~ d- ?0 u3 z9 H
6 R4 C2 M2 ]! Q1 d
注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;) w5 y; F- a, |* ?1 _: e/ _& C
dpigs -H --lines=206 @1 D1 ^" e `( x! P6 t
软件包卸载命令
- ^9 s3 x1 J. H0 W j: `7 S( ^' j& ~& F, G" P+ Y% k
apt-get purge #purge 后面接软件包名称
4 p0 Q! |3 o# {: U, m* q Q0 F5 Iapt-get --purge remove #配置文件也清理掉 命令后面接软件包名称- i7 X3 c/ K* _3 y& U: f) ?% S/ ]
示范 以 删除 golang-1.13-go 软件包举例;
% q# s) U; J5 z* l9 q$ `& o9 K% I7 v, E5 E4 {2 z& w
root@localhost:~# apt-get purge golang-1.13-go/ A, z) F/ c- |9 a7 [
正在读取软件包列表... 完成" a; { r7 X$ |2 N. k( e/ Q
正在分析软件包的依赖关系树
: |! U3 p0 y) i6 X4 D& J正在读取状态信息... 完成
2 _1 w% T0 f2 B1 A下列软件包是自动安装的并且现在不需要了:: G( P* }/ r% @ |! O
golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src1 Q& q3 Z" d# t
使用'apt autoremove'来卸载它(它们)。3 }" F8 y8 g: ]7 t: P+ ^. A
下列软件包将被【卸载】:* E4 d: A( Q3 i5 P8 w
golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*
, `$ J7 b. R% [升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。
/ ~1 P8 S( u* s/ [" A. a1 ?解压缩后将会空出 230 MB 的空间。2 t/ e* T3 f9 u4 P( N
您希望继续执行吗? [Y/n] Y- \# S! V5 i; ^' m
旧的内核清理4 A( P+ i3 }7 L2 Z
查看当前使用的内核
& Z+ C8 o( y/ E: x2 x
4 e' c; ]' C7 ^4 k$uname -r
$ R6 t8 d- I% z7 R; e# P7 Y$ R5.4.0-60-generic$ g0 C! w' O$ \' `3 o
$dpigs -H --lines=209 L+ Y6 }# h* L5 j
74.1M linux-headers-4.14.91-bbrplus
/ z" Z# Y8 j1 i5 a70.0M linux-modules-5.4.0-60-generic //保留! c% p( G, t) J- K4 A! h [. x
70.0M linux-modules-5.4.0-59-generic //保留 E4 y2 Y$ n+ d" I
...) E L' J/ [! A4 \
看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);6 V4 m$ A- G6 F% D+ O3 V
7 a% H& b8 q9 d1 y6 G
$apt purge linux-headers-4.14.91-bbrplus3 k' V0 Q! d( H7 K
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):' W& [5 b# p- s7 ^( z
+ ]6 l M& O* `. \
$update-grub
% j7 ^4 ^, x1 B& i0 U* X3 M0 iSourcing file `/etc/default/grub' m9 @2 _0 o7 J5 f w8 O* S9 H
Sourcing file `/etc/default/grub.d/init-select.cfg'. ?' I- j" A# T6 L A& d
正在生成 grub 配置文件 ...( f. d9 G- G& S
找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在
- c+ i4 n2 W" Z/ L找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic% e1 N; U& s* a# H6 p! I
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic- y' }3 N7 y0 e" B+ g4 Y4 ~
找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
/ e0 [+ F$ C' [& N; ]$ |2 x找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic
1 R4 A& J; Y' _' ^- p8 D# Y8 i( d找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
- H& P6 }& Y, I7 A" i+ O完成
4 \% t; k' x z. Y6 v3 G7 `...
6 @: d7 u; Q+ o; J( ]9 [, r; U
相关知识
" E$ A7 ?% D4 \; a& C+ N+ q2 |' [LINUX的磁盘管理du命令详解
4 L0 i. F1 ^2 s
' \( A1 n3 o1 H! F, p c1 X" vdu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。6 B- R: p1 H. A
+ S1 A, }( _% O% r7 f, }
DU命令用途
! [, o4 T# j; k5 Kdu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。4 H6 K( n( r' o: p ^2 M
' M# T% A" c" K找出大文件& p h" ~* q: C' L1 q
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
, y* S. r/ _) P G1 e
. u. O+ s: t' T* Udu -s /home/* | sort -nr #/home目录检测5 |6 P) f8 l5 ]1 t L0 y& w6 ^
* v0 z4 C" q/ u: f* K |