|
再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理)+ C ?* c, j. r( a8 E5 U. }
2 N& d- \- {: ?4 S. C7 Z8 P
本文章实用性说明; N1 t+ I1 e- Y. x* ^$ A6 ~9 ~) c
1.检测Linux服务器的磁盘文件大小;9 z3 z6 L! D6 ]; F8 t) R0 O) {" E
2.重点清理项目;- y6 j+ i7 u U! Q8 o5 C
4 ^" F( j. W3 @* C+ x3 n3 \实用命令
) H+ s K1 i0 n( }/ m8 o0.查看硬盘剩余空间
8 v( x' L, k4 x( y- H9 _% x+ g8 H* u1 Z# J
$ df -h #查看当前硬盘剩余空间并以GB单位表示
* c8 H, L% s5 V) Y- [# |文件系统 容量 已用 可用 已用% 挂载点
, F9 f+ Y. d3 o% Mudev 448M 4.0K 448M 1% /dev
8 A, d+ x% P/ U% L2 k# D, Ptmpfs 99M 1.1M 98M 2% /run0 i8 B2 \; A* F2 f6 c( k
/dev/sda 25G 13G 9.9G 57% /
7 z, Y, Z" q5 v% h, Dtmpfs 491M 0 491M 0% /dev/shm9 f' v& v1 o1 o, |
tmpfs 5.0M 0 5.0M 0% /run/lock
( I/ g+ Z. L* _8 ?2 z% htmpfs 491M 0 491M 0% /sys/fs/cgroup
, y$ I, [- H G# n' [( B( g! k5 Vtmpfs 99M 0 99M 0% /run/user/0
8 P" ~' a2 T6 j+ ~& s5 m1.查找大文件6 Q0 B7 h( ~. D9 {
' \0 x5 u' ^* O' p* y3 x
find . -type f -size +100M #查找当前目录100M以上的文件
- ?$ `% ?9 a: t2.对查找结果按照文件大小做一个排序
9 T. G6 M* S& j& Q! |- g% C3 R) I# P# q n8 Z# j7 m: S
find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr
# T+ W. y& l: s' _, U0 M1 O2.1查看当前目录下某个类型的文件或数量
0 H0 U* y% K4 r5 X# F) L( v. {( M: [
find . -type f -print | grep php
: M W4 z- q( F2 j9 A: ?find . -type f -print | grep php | wc -l
" a1 F2 R2 \: @3.查找当前目录下前20的大目录! n2 n! {; S, b. r2 R) y& l
i8 j; C. f2 }) o: z# E$ o
du -hm --max-depth=2 | sort -nr | head -20: C) I1 N+ `5 Y7 t) c( w+ x- S
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;# E+ L3 i$ y" ^+ @& H
% `+ u$ X$ G: U6 b* v! e
4.计算当前目录下所有图片大小,单位为MB;
! K" M6 ]* R' u7 w! U/ \2 y" ]/ b. F3 b. P% u4 [
du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
6 z/ m6 x: E' v1 a+ I: W重点清理项目
* W7 M$ d/ R, tMysql 日志
# d* U/ t+ V! e手动清理日志文件4 [# Z, V. n: C. M r2 y
mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;
$ h3 o6 `7 Y! C' R& l' U: j0 p
m1 z1 k3 {7 H5 Q, v( p$ B1.登陆进入mysql,并使用 show binary logs; 查看日志文件。6 I" ?9 v' n2 R- W! K
3 b2 c# t }2 w8 O2 [0 F2 nroot@localhost:/home/# mysql -u root -p
! N; @) s0 g. a! lEnter password: #输入数据库密码, y C5 H- `8 M# C5 F. b, B
mysql> show binary logs;
3 n6 T, A$ N: {8 f w8 y4 x2 Z, J+------------------+-----------+7 Q+ n' ^* j8 @' Y3 l' D& |! D; \
| Log_name | File_size |$ q$ `; s/ o) q# \( j- k6 h
+------------------+-----------+- A5 o* O, K$ H" P+ J! X
| mysql-bin.001368 | 3175578 |
) H# ~6 ], j% n% Y| mysql-bin.001369 | 177599 |
6 J& d9 C q) r: ]+ z+------------------+-----------+
( b9 u4 }5 f: }; n" C5 y2 rows in set (0.00 sec)& Y& R2 g: o) l. {; R/ |! u% I
2.查看正在使用的日志文件:show master status;
0 N! G$ E& C! u q3 q
6 X9 n# Z% Y8 B8 S$ k9 ?mysql> show master status;' R1 ]( ]; ^+ }- l Q( L
+------------------+----------+--------------+------------------+
- l- B; ~9 Q: O' G8 Y1 f8 X| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |! V+ [+ u* [- O6 s# u( \* T% V$ X, G
+------------------+----------+--------------+------------------+3 F1 y. Y4 I9 H+ B+ c4 p5 K# f
| mysql-bin.001369 | 348563 | | |
! w' f) [ U( i' k) `+------------------+----------+--------------+------------------+
+ @; Y) R5 \* Z. M% \5 L( `2 Y T7 ^1 row in set (0.00 sec)
" k! i$ e8 f6 Z2 C如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;1 t2 B* h) B( [- O0 X& K% U& X
) ?0 J% ?, i5 d$ T( q% |. ~0 q4 g3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';0 ]2 T& r5 F# `5 x
2 [! I! b3 A9 t& V+ @/ Q1 umysql> purge binary logs to 'mysql-bin.001369';: U! [$ }" A v) _+ s
Query OK, 0 rows affected (0.02 sec)
3 x6 L) h- x1 }% m; n: ~4 Ymysql> show binary logs;
8 _7 P1 G' p. g1 X+------------------+-----------+$ C( D1 V. G( H* |+ b" H
| Log_name | File_size |' L$ ~, s# y2 T; q( S9 G
+------------------+-----------+/ W v. t+ B& L, ]. y0 ^, d
| mysql-bin.001369 | 949552 |
- ^! ~2 O- G E: N4 X2 C1 q+------------------+-----------++ M6 `% p4 X' d. m8 n* x
1 row in set (0.00 sec)" R# P& p7 Z) G1 F5 z
删除完毕;
( A( I& {, h9 y9 C( y+ }: ^7 |7 U, H
定时清理日志文件" O9 `8 U0 w4 V# o8 F% W( V1 B2 S8 f
1.主理人自己已经设置其不产生日志;
0 l1 |$ g5 R, R2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
+ Q1 u3 E( L; W; `" x m( J) ^' N/ n( d) [1 j2 @" [
mysql> exit: s3 J4 }$ V" `2 \# s
Bye
# p* @7 v. h# x0 Nroot@localhost:/home/# vim /etc/my.cnf
* ?- p6 K; U$ b1 J: i2 V编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;6 s5 G$ J* Q, h/ I6 q) L& [& |
3 T/ f" b6 B8 x; ilog-bin=mysql-bin
& \. G3 v1 Y% P- Xbinlog_format=mixed
: F3 u& ?# [* S6 ^8 G$ O* V) @server-id = 17 i. [$ g2 d: b
expire_logs_days = 109 w, F& `! {* I& Z
改好,保存;重启 MySQL 即可;
5 b$ `' \# S. u$ {4 D
0 C5 B7 b" ^' O8 @# w3 }0 u; A( c4 Wroot@localhost:/home/# lnmp mysql restart7 @ U( h, e' x0 A4 w& J8 Z1 k3 a
或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;
( @, O& C0 c, s8 M
0 E+ E) `( z2 r3 l& ~, D$ L$ ^##注释 log-bin=mysql-bin
/ n! l0 w; t: c; k2 y3 \##注释 binlog_format=mixed2 E, ^% P) y6 _ ^
参考1:Mysql 日志爆满,删除日志文件,定时清理日志
7 H" _ \: W9 x' x* N8 l. F( ]2 B参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录: w8 m0 |' a' _5 A! ^* r9 q
; r8 T2 _# E# G5 [& ?Nginx 日志
: U0 u! I" O. { \. M9 H手动清理日志文件
. Y X5 T( u8 A& A' U% @$ }+ L. anginx log;7 {% W: ]) j4 b+ x& o
以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;% u* r( L( k" s2 ]$ N& m* |
" ?: R) C( \& c( J9 F! q* {
找到相关日志,直接使用命令 ls 查看有多少日志;4 y4 W D) i% ^7 l6 ~( f( d' M
9 M8 w; c# G% q4 w) S1 v
root@localhost:/home/wwwlogs# ls
( C P+ Y0 _7 wnginx_error.log6 q. k7 b! F# P' w9 B
GeoLiteCity.dat limbopro.com.log 7 h/ R8 l( e: f) Y' i7 \
access.log $ P* J3 y1 r) }- o
使用 > + 文件名 清理日志文件;0 r4 h( B4 E- @( g+ U- B
3 y K9 y9 c7 p1 {6 K2 W* v
root@localhost:/home/wwwlogs# > limbopro.com.log
, T8 d1 s5 q" mroot@localhost:/home/wwwlogs# > access.log 3 w1 e) [$ }( ~' B6 S1 r& E1 ^
定时清理日志文件1 Z1 p' }6 S( m" {- y
使用 crontab 定时清理日志文件;
/ n [) T2 x: H1 D; l8 V: a- B8 r: {4 U$ [4 S
root@localhost:/home/wwwlogs# crontab -e
; K/ E% }$ s: k* B1 e# u添加一条,设置每日凌晨零点自动清空日志:
. {% P3 U5 ^ B
2 m1 i# G/ l& f( L% R$ x* L6 C6 ]0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志! ~! o+ C6 {$ b ~
0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志
. L% N% T' z8 ]: d保存,退出,重启 Crontab;
1 X& Y+ \0 ~9 k$ L
# B3 w$ P' _- W2 B9 R6 |root@localhost:/home/wwwlogs# service cron restart
) @( o, l6 e! F! jroot@localhost:/home/wwwlogs# service cron reload
/ n9 ?* n, `; M1 ^*日志文件具体位置,以实际为准;本方法比较粗暴;
! R+ H$ k" r$ h& _+ U
4 L. V5 k/ P& [+ d% \; ?$ S% N2 j参考1:Linux crontab命令及其用法;- [: Y9 c8 ^% q/ w
) N% Z' W6 W e: s
journalctl 日志清理
) e4 O( M7 Y C6 G. G6 |配置文件路径: /etc/systemd/journald.conf;) n) Z$ _7 u1 q' K
日志存放文件夹:/var/log/journal;& }8 o# v4 ?5 B+ x
$ _% q* C- u2 Z- }4 T! W5 _) `systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。2 \/ [) p/ W& |( }2 F
' R- X: K% W6 F, e6 K清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
/ c- O8 w! E8 d0 a5 X; ~" [2 f- W
+ d- r+ d8 x$ Ejournalctl --vacuum-size=20M
- U. |& v, u4 G系统日志清理
R C, m; ^; ~1 @7 Z系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。
; ?0 O6 h1 w! A7 u3 d, `
3 k6 V. x. g Zsudo apt-get install ncdu: n9 y# R! p3 ?" L, V' r0 w' s o
sudo ncdu /var/log #然后按i键
! [7 x s' F1 e6 t+ g, D& ]" Fncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help ; G" l/ i5 L, W& L
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------
, T' I% t0 L1 ]2 }" H& O) e 48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ + ~. u. Q7 c) e! V
16.9 MiB [### ] auth.log │ │
8 a& L4 } M: q 15.0 MiB [### ] redis_6379.log 4 e$ _ e4 x2 x/ ^$ u& }
...
$ I/ m. Q0 N( ]6 u8 j( o然后进入 /var/log/1 z: r- J" I9 I7 [# |: x* l
7 f& w8 _1 H3 @6 j) K* D' s T
cd /var/log/4 _; \4 a4 ~5 y
> redis_6379.log: n# S- R& v5 |& Q: O, e1 |( L
安装包清理
! \" u% w5 I; |% ?2 s4 ]查看安装包缓存大小
3 `, k0 v# A) r+ t7 D0 m+ D4 R
( K$ K7 a8 N* J3 ~' {du -sh /var/cache/apt/archives0 f4 h( j0 A7 y* v
使用如下命令删除已经安装过的deb包
q6 `: D z" @% H2 h; }! _) l, o2 r
sudo apt-get clean% h# ?& N- z+ x3 j
sudo apt-get autoclean
) @+ @6 v& g6 n删除孤儿软件包 已经没有用处的依赖3 J) s# w8 N/ D0 k
G' o, |+ F) F: S: ?
sudo apt-get autoremove
* ]7 w k& ^+ u3 @清除手动安装的依赖包' C1 {' R) J$ }/ d6 y- Z
) l- \; l4 C9 l& g7 |/ C4 O
deborphan! `& c( F4 p z
sudo apt-get install deborphan
) s$ G$ F2 L- w% g6 h# w6 adeborphan | xargs sudo apt-get purge -y
8 D. Q2 a9 ?1 ]$ ]) n删除大容量已安装软件包/ T0 w/ `8 P3 I, `" L; C
首先安装debian-goodies2 [. V! L* P- I) t$ B. x
( j0 E0 `/ o1 l
sudo apt-get install debian-goodies. [# R) F; e# s& e, `5 b
然后输入下面的命令+ N2 n ?) m$ p
) z+ T$ r! m- f1 r, |dpigs -H, c$ U) D. L1 h6 Q) e/ H
我的输出结果
8 F: ]) x q: [' v, y* S! ?/ F- f; s* ]
531.3M linux-firmware
( `( f( Q8 ?/ a3 n6 g315.0M fonts-noto-extra
: o4 ` A/ [# Y282.0M libgl1-mesa-dri
8 h5 s, R+ f( @; }3 u) b" [$ t214.7M golang-1.13-go2 Q. z2 b* f+ X4 f( P; L! f* J
212.9M linux-image-4.11.8-041108-generic. O' }* U: m: m @' p9 N3 r
181.1M linux-modules-extra-5.4.0-60-generic/ M( T5 p' m, R1 Y
181.1M linux-modules-extra-5.4.0-59-generic u6 Y H& a/ e; l" k0 P. G, [
181.1M linux-modules-extra-5.4.0-58-generic* Q/ D2 n: W' P' |& ^
166.2M docker-ce-cli8 A4 g3 @8 J# S4 P( M
123.3M containerd.io# {9 }7 N6 A2 G- y( H
上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个 w5 N$ [# D2 |5 J; w) Y0 y
0 o( {/ I3 U7 P* Q8 U& J/ b注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;
( u/ U6 \) E4 i0 R2 g# Cdpigs -H --lines=20
, G; q8 N2 K$ [5 U1 r: c6 ?- ]9 k软件包卸载命令! C3 L5 \3 F, ~" H- ]0 p3 j
1 |# V* F1 k5 {$ j' X6 oapt-get purge #purge 后面接软件包名称
/ C( {: ], M6 _' N6 O. Rapt-get --purge remove #配置文件也清理掉 命令后面接软件包名称
! H& Z! p6 l$ w+ z, f5 R示范 以 删除 golang-1.13-go 软件包举例;% {% G2 N2 J: Y; q* |
, U/ e* ]. ^. f$ w' S+ oroot@localhost:~# apt-get purge golang-1.13-go* {& e6 D& _: b4 }% y
正在读取软件包列表... 完成. `9 f8 p0 m; H" P0 z
正在分析软件包的依赖关系树
0 z( G* y( t/ w8 G) j! J正在读取状态信息... 完成
5 ]6 g X& y* L4 T: A下列软件包是自动安装的并且现在不需要了:) p: z4 k9 L8 g# t$ A
golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src: |0 W6 D" O+ Q( t1 _. m# K% T' ~
使用'apt autoremove'来卸载它(它们)。
, \: f$ X0 ]6 F8 Z. k5 @下列软件包将被【卸载】:
- N" Z% a+ k$ \0 a+ F6 ^& d. { golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*. D$ Y) u# x. E; q5 D" K
升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。6 g5 c P4 o$ s# b! S3 c
解压缩后将会空出 230 MB 的空间。$ T$ m7 z/ D8 t! h+ S- a* c
您希望继续执行吗? [Y/n] Y
; r4 }8 u% X) b s8 X4 k( c旧的内核清理6 \" J% ~4 k$ ], n* f% V4 O
查看当前使用的内核1 H/ n! D6 ?8 ^( p d3 O+ ]3 M
9 |5 \3 ]) E) n) R m6 ^1 q
$uname -r. L G. g9 J. q, Q3 X
5.4.0-60-generic
4 O9 R& V9 d' J6 w- ]0 H$dpigs -H --lines=20
, y; h( X. z" m7 ~74.1M linux-headers-4.14.91-bbrplus
# |2 `5 z/ e. U70.0M linux-modules-5.4.0-60-generic //保留
$ R; l( J* W: V% ]8 S# v! r70.0M linux-modules-5.4.0-59-generic //保留/ W* |2 Y7 O; T
...
6 R5 L9 C( v: v! ^2 B看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);
# a& } G4 V+ d- @9 _" ], G! d
& `, j% ~4 Y* ]2 Q( N! d$apt purge linux-headers-4.14.91-bbrplus8 d1 F1 Y: F* i% m& _' d* A
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):/ v9 F0 r9 ~% n. U' c/ U2 M
( A8 \; [. \/ q' e$update-grub5 h0 b" H6 s: `! W. W
Sourcing file `/etc/default/grub'
) ~, ]& N: r' p4 CSourcing file `/etc/default/grub.d/init-select.cfg'' f# _0 o# W; _& J( ]
正在生成 grub 配置文件 ...
; `8 o& C V/ q: A" J! s9 ~0 n找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在 5 p6 q, b' e6 u$ o
找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic
3 I3 J. ^% [: b K找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic
! f* y7 _4 z& K% s7 q" v找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
0 E4 @, V% o3 S" N& X. y; F: }( f找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic, @$ W' m. V! ?7 ?) ~' L
找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
4 a: p, g9 d* S. s: J完成
' G8 K. f/ s3 T0 U/ N2 ?! a: I& b...
0 m' M, o) }9 v3 _ Y9 R
( H4 w) F& t, s6 Q, ]- m相关知识
' J) f5 R5 S# N; E& q& d( xLINUX的磁盘管理du命令详解8 a) f; O# i8 L8 v* e3 m' \4 [' t3 T
+ D" N4 T+ U: Q. E+ udu(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
" ?& q% F; I- Z4 g8 i4 a, T6 |: R6 X6 B+ w) V! _" g3 H
DU命令用途9 o0 R7 N& o; ^/ V8 {& @$ o
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
) M' ~# j' o" r, r% G# R
6 I4 l6 W( j! t4 g找出大文件/ a- e+ W6 u8 s$ ]
磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
, @% N8 B& m, F& Y9 I1 C4 H9 S# |: I, p0 N7 F; J1 ]: K* q
du -s /home/* | sort -nr #/home目录检测' D$ H( M j/ ~6 M3 n/ P
7 G( N- A* D D+ e3 T |