再大的服务器,用久了磁盘剩余空间也会变得越来越少;何况我们大多数买的服务器本身存储空间有限,所以抽时间进行一次磁盘清理,将一些大文件删一删是很有必要的;(完全可以实现脚本自动化清理), c- i% I- g/ @" } h
6 F' w7 R5 {4 q) O# i) {6 F9 s 本文章实用性说明7 i9 b7 T& h0 l: h* b
1.检测Linux服务器的磁盘文件大小;' Z8 E8 w( O3 ~ {% ^; n& g
2.重点清理项目;8 S. g2 L8 _& o" N e
. v B& ?) t3 a7 l! q5 h+ N6 t2 [. F4 i
实用命令0 r. Y% r3 O2 s; H
0.查看硬盘剩余空间. ~- e8 C. O }/ Z; \
( g: ^/ b6 U* d+ l" i $ df -h #查看当前硬盘剩余空间并以GB单位表示
6 K' p7 y# M( z" Y; Z9 P/ n 文件系统 容量 已用 可用 已用% 挂载点 Y* M( X" {3 u; {5 z, g
udev 448M 4.0K 448M 1% /dev( u5 p7 ~9 i- ?* x2 \
tmpfs 99M 1.1M 98M 2% /run
3 I C6 X4 H* ^5 a, |2 H /dev/sda 25G 13G 9.9G 57% / M; d, x7 h- e3 A) |7 w) _
tmpfs 491M 0 491M 0% /dev/shm
# ?. t; P$ G+ w1 H% k" D tmpfs 5.0M 0 5.0M 0% /run/lock
5 q8 t& P* |8 i tmpfs 491M 0 491M 0% /sys/fs/cgroup$ V& W* ~; i: B
tmpfs 99M 0 99M 0% /run/user/0
- J/ w4 G y1 [9 H) P 1.查找大文件
4 ?6 b7 u$ c8 s/ Z% c% G / c" a+ J t; ^" ~. ^6 s3 x
find . -type f -size +100M #查找当前目录100M以上的文件
# W4 b- {9 r. e* X 2.对查找结果按照文件大小做一个排序
; L, T. D: P7 C! y3 q5 c# O
/ {; Y' p, \- Z |, d8 e6 x5 w find . -type f -size +10M -print0 | xargs -0 du -h | sort -nr7 K! b2 J: K& |" H
2.1查看当前目录下某个类型的文件或数量4 R- H3 \6 w8 c3 Z
' \$ l }: S; |$ B find . -type f -print | grep php
" y' @6 e8 e e find . -type f -print | grep php | wc -l5 ~$ f2 Q0 d% C0 j( g
3.查找当前目录下前20的大目录
: B9 W1 O# x: R: U: R& Y( t# d8 s 1 ^+ a* m6 l: ~: E
du -hm --max-depth=2 | sort -nr | head -20; d) t, n9 R( \1 w% k: H7 k) Z8 ?
*这个命令我常用,先列出20来个大占用的文件夹,一一击破;
, Z, j; P9 M- D1 r/ s) @* K7 M T/ c' a/ E0 s( u$ |. \% p) d i( \
4.计算当前目录下所有图片大小,单位为MB;% \( W0 `0 r) P
% D+ ~+ Q3 H% O( i" v' K+ s du -m `find ./ -type f -iname '*.jpg|*.png|*.jpeg'`|awk '{sum+=$1} END {print sum}'
' I% A- |5 y; [- T+ X2 d 重点清理项目
3 S3 N- ?' U: t" F6 o1 K Mysql 日志
x+ W9 m& z8 b$ M2 ? 手动清理日志文件
S; {0 {1 R. ~1 E% e. g mysql binlog;我的日志竟然有7Gb... /usr/local/mysql/var 一般存放位置;( I! b5 t9 p6 ~$ c9 R4 A6 T
7 ~- w! i7 }8 v2 v 1.登陆进入mysql,并使用 show binary logs; 查看日志文件。( _8 _4 _) R" `2 R/ P5 D7 O
0 e: U) X) K; P8 S2 J& W
root@localhost:/home/# mysql -u root -p0 R# N$ {" O, X: @
Enter password: #输入数据库密码
! u7 s7 [" W+ L/ [ mysql> show binary logs;
/ r7 g# \2 p( Y5 I' [ +------------------+-----------+ L* h. H; D4 ?( N: K8 L3 P
| Log_name | File_size |+ z# `$ g" ]$ e$ H' H
+------------------+-----------+
, J3 j! J* I$ d1 Y' T7 d9 N | mysql-bin.001368 | 3175578 |
! r. s4 v R4 C | mysql-bin.001369 | 177599 |1 t6 _0 h. O5 Q$ W! r& V; g
+------------------+-----------+
+ m2 {/ i2 L( Q 2 rows in set (0.00 sec)
6 u; h8 L& r% J: t. Y. ` 2.查看正在使用的日志文件:show master status;) V( O* R5 W9 h; w: ?2 C
* j1 \% a$ d+ X( y- G
mysql> show master status;
, n1 U4 K4 B6 D! j +------------------+----------+--------------+------------------+* f% v) W/ V a) G7 E% M \7 G
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |3 t& b# H( [5 g& v( N* F, g3 M* h3 a L
+------------------+----------+--------------+------------------+
- T, I t5 c9 ?2 H | mysql-bin.001369 | 348563 | | |
$ b: e8 r) I" v- v! t- A% N+ G2 b* k +------------------+----------+--------------+------------------+( }" Y, O; r8 O
1 row in set (0.00 sec)9 C& ]) H5 k6 S) m0 H" ]5 ?* q2 d2 p
如上,当前正在使用日志文件为mysql-bin.001369;那么等下删除日志文件应该排除掉该文件;) u( t" b/ Q [8 f0 k
1 F8 M4 A* c8 o 3.删除日志文件的命令:purge binary logs to 'mysql-bin.001369';5 l3 I7 P1 i+ \3 s, C
* x. O, _9 H& F* J5 l. x! B1 N mysql> purge binary logs to 'mysql-bin.001369';' s4 O, s( A2 E0 p! l
Query OK, 0 rows affected (0.02 sec)
1 ?0 w7 Z2 v4 p9 B' |% L. E- }/ N mysql> show binary logs;
/ n% Q- R7 v. m/ z +------------------+-----------+
' K1 |! t( \' Q6 v% p S3 f. g3 @( V | Log_name | File_size |
, z+ m' `( x5 F. e9 C+ a+ v +------------------+-----------+8 g6 x8 H5 R, U2 k6 n
| mysql-bin.001369 | 949552 |6 z! W* L, x% c! {4 `, _9 ~
+------------------+-----------+
* Y, y; r$ a9 o 1 row in set (0.00 sec)
9 n- q% r' W; _+ N 删除完毕;
5 P) x0 B: l6 W1 h; M
, h* v+ N0 C9 I9 l1 X 定时清理日志文件
: ]$ e# r* d% q A4 @. | 1.主理人自己已经设置其不产生日志;
4 k( i. R7 C) i2 n 2.编辑 mysql 的配置文件,设置expire_logs_days(mysql定时删除日志文件);
. ?5 G; G% b' @# B% p9 a3 J
, N0 h5 o, x1 ? mysql> exit
( c2 d, }# Q- M5 G' u) W Bye- u8 h+ h( }3 t& k
root@localhost:/home/# vim /etc/my.cnf
% I3 E9 B N+ | 编辑 /etc/my.cnf 文件;找到 expire_logs_days = 10,这里设置的自动删除时间为10天;: E& I0 M: p& X+ F
" i2 v Z# g5 C2 \( r L, U
log-bin=mysql-bin
' I) M6 N1 A+ |- X3 M) T+ y2 V# l binlog_format=mixed
, p0 j; w" ?1 \ server-id = 15 u9 a5 S2 N7 ?3 q* c! Z2 P
expire_logs_days = 10
% H/ l& n# R* ]/ M k* s 改好,保存;重启 MySQL 即可;$ {$ r6 J8 q+ Q8 V
% |% }8 b; a n1 z) R$ Z
root@localhost:/home/# lnmp mysql restart
3 E7 o$ q. Y" I/ `4 M7 \" V 或可编辑 mysql 的配置文件,注释掉以下两项即可不再产生日志,保存重启MySQL;) H& g2 E0 C M4 p3 |& ]6 r" Q$ {
6 e- j- a% \& p! n
##注释 log-bin=mysql-bin
. x) A6 o& B) c+ l4 R ##注释 binlog_format=mixed# w- K) J9 g( C$ v& U N, ?, F
参考1:Mysql 日志爆满,删除日志文件,定时清理日志9 b5 c0 b8 G$ e
参考2:Mysql之binlog日志说明及利用binlog日志恢复数据操作记录3 L: p$ T& d$ f2 g9 p5 |# W" F
7 w. b/ Z7 p9 `! h
Nginx 日志; M; I7 t9 h" H) h l
手动清理日志文件
) g2 s3 d, {+ T$ Z: V, _* g nginx log;
2 Q/ @. V5 g4 O 以前博客被CC攻击/压测的时候每天产生6 7 8GB的日志/home/wwwlogs 我存放位置;
0 x+ L: i7 V. v & g& a$ x* f6 ?, `" c7 Q' g6 M6 D% D
找到相关日志,直接使用命令 ls 查看有多少日志;
5 A4 p3 l6 V" I0 l8 z; B+ h) x 4 w9 B* d( q. `9 q
root@localhost:/home/wwwlogs# ls
# U2 k q0 ? x nginx_error.log$ c3 n( L; f* u3 j5 G
GeoLiteCity.dat limbopro.com.log
5 l4 ~7 l- t0 s3 O: y access.log
6 b' K' K: o0 u 使用 > + 文件名 清理日志文件;
9 `! m5 W7 ]9 q/ l( b( u V % T: [8 j4 @4 k
root@localhost:/home/wwwlogs# > limbopro.com.log
' e6 ]3 P. w; L! ^6 j+ m- S& b* x; f root@localhost:/home/wwwlogs# > access.log
4 F0 {* X1 J% U& Z$ V 定时清理日志文件
6 X/ t; v O5 d2 L, @ 使用 crontab 定时清理日志文件;! y0 w% ?5 j4 k4 d
! `7 Z' `4 }% q! g1 l1 j" M root@localhost:/home/wwwlogs# crontab -e: S+ Z& j1 K# u# a# M! q3 x2 F
添加一条,设置每日凌晨零点自动清空日志:2 I) d2 v# c, }) b
3 F y0 Z% l/ j, c
0 0 1,15 * * > /home/wwwlogs/limbopro.com.log; #每月1和15号自动清理日志
1 `7 q# F6 v7 N* ^! F 0 0 1,15 * * > /home/wwwlogs/access.log; #每月1和15号自动清理日志
% \8 T' y' D2 h6 B 保存,退出,重启 Crontab;
& ? u4 V/ a; `+ R, ?% l: Z
& d% ^1 f# e1 s* }6 R! G root@localhost:/home/wwwlogs# service cron restart
% C/ n' Y$ m/ A$ ?8 I. ^ root@localhost:/home/wwwlogs# service cron reload
! x, K1 L M* ^) g *日志文件具体位置,以实际为准;本方法比较粗暴;" t) @: M5 g7 v: y$ d
8 Z! j/ ]1 [0 D, w! u" ?' Z
参考1:Linux crontab命令及其用法;& b( X+ i p5 q
, |- W6 P, W. q/ v" P, `! E
journalctl 日志清理3 S1 w F5 Z( V5 L
配置文件路径: /etc/systemd/journald.conf;* b% d6 P: O, G. [
日志存放文件夹:/var/log/journal;
- O8 Y9 n" I+ K
4 l0 c5 V6 X3 E. @7 G systemd本身使用 systemd-journald.service 来提供日志服务. 它默认以二进制的格式将日志文件存在 /var/log/journal/ 目录中。
. k8 ?1 C9 _9 J( p7 K
! x& w4 M9 C2 e( O) W+ ?1 F3 |& v, H 清理大于20MB的日志,大家可以将清理命令放在 crontab 自动运行:
1 D K) S( W7 o' U $ S/ ] L5 n; i& L% u F0 r- B
journalctl --vacuum-size=20M
. u2 ?0 b, x4 \" p% x% t( W4 R+ ~5 z 系统日志清理9 T" ~7 g4 b1 l7 C$ t
系统日志位于 /var/log;日志文件会变得越来越大,我们可以用ncdu工具来查看大日志文件。6 W+ _* W' X$ t/ z, t
* ?" Q+ f/ l: k. D+ s" ~* J sudo apt-get install ncdu7 u& T" X8 P/ V- {
sudo ncdu /var/log #然后按i键
, z2 _1 Q$ ^. Q ncdu 1.14.1 ~ Use the arrow keys to navigate, press ? for help ) E' z, C' e. v# J- q
--- /var/log ----------------------------------------------------------------------------------------------------------------------------------------------------------------------! {% S, m) C$ ?' o ~
48.0 MiB [##########] /journal ┌───Item info──────────────────────────────────────────────┐ 1 s8 H$ `1 d6 Y/ u& y
16.9 MiB [### ] auth.log │ │4 p6 g7 p+ B! J+ R7 i! X2 h
15.0 MiB [### ] redis_6379.log
@1 a! ~& l( h# |9 j" e ...1 e7 u) ^( f0 N! z6 w
然后进入 /var/log/; }$ s& d+ S {$ s
% L6 ]4 l! \. ]. L0 }: l
cd /var/log/3 p5 n4 T0 v# ]9 O8 y- s
> redis_6379.log0 Q3 c G; z* w
安装包清理$ b. G% G. ^/ Y$ P
查看安装包缓存大小3 A* }4 i' K# K1 p+ Y; }. R' ~) W
. U5 e' j( p, g6 E) `4 l% I+ c$ l
du -sh /var/cache/apt/archives
o/ i m( e5 k$ i 使用如下命令删除已经安装过的deb包# V g- P+ U! W8 r' L+ [
" [# I! T) F; z, Z/ l; a# k sudo apt-get clean. I, n4 g: g7 z1 g
sudo apt-get autoclean' C6 ^3 ?6 v. i( G& I; ]
删除孤儿软件包 已经没有用处的依赖
+ C, `* F- _* W. A( n% k / C& T6 u' O j1 A
sudo apt-get autoremove# W: K/ w/ J h
清除手动安装的依赖包
- q( ^: h' z4 u. x4 y4 A 5 y- a1 F( e/ y) k
deborphan" Y- S5 ?2 K6 h
sudo apt-get install deborphan1 Q3 X2 ~0 B" C' A
deborphan | xargs sudo apt-get purge -y
' b$ t5 S8 @& }1 \$ @$ Y# |: x 删除大容量已安装软件包
9 Y$ `& f8 @& o/ v3 T3 c% o 首先安装debian-goodies
: c* L' _8 U/ m! J2 f, ?& g; K0 x: u) c2 f d5 A: g+ c( k6 f" Z
sudo apt-get install debian-goodies
( D% K9 c; @8 B! h* z7 M 然后输入下面的命令6 h5 k( G, H) Y( Z
& o9 \9 J. g. l, _7 F: [
dpigs -H
6 P$ V4 [. M1 D1 E2 e 我的输出结果1 u4 I/ Y$ I( _0 ~2 C
" Z( P y X/ r; N2 M 531.3M linux-firmware
7 Y* N% U, w) p+ [3 `, f 315.0M fonts-noto-extra
w4 m- B/ J/ N5 R% J2 f! _ 282.0M libgl1-mesa-dri2 G1 ^( W2 l0 {( Q# \
214.7M golang-1.13-go
, z) Y1 f! l5 Y! ]# `7 ` 212.9M linux-image-4.11.8-041108-generic$ P7 S; o0 e! r+ L( @ e' v* a% r' Y
181.1M linux-modules-extra-5.4.0-60-generic- m! k% R, ` a7 c; N7 d* K" p
181.1M linux-modules-extra-5.4.0-59-generic
3 t0 [. \, c- B+ M5 q 181.1M linux-modules-extra-5.4.0-58-generic
5 W! u' _ p% U- b/ I$ R2 e 166.2M docker-ce-cli9 o" Z2 v$ d( S
123.3M containerd.io
% P& h: a' i5 a. g- E 上面的命令默认只会显示前10个结果,你可指定结果的个数,比如20个
6 O; ~1 e4 c! _0 | + r7 e1 s% U; U1 A* q3 m8 F4 _
注意!linux-modules-generic 是内核,请先确认当前的内核是哪个版本,否则可能导致无法开机;见后文 旧的内核清理** 部分;
/ j) k8 I ?' f5 k# q* { dpigs -H --lines=20
8 C3 m& o/ w, i& N5 X8 H7 F 软件包卸载命令
7 H" }) n, [, _$ N- d- _/ V
* H/ X. K8 d1 `1 ^9 [! u& r$ N+ | apt-get purge #purge 后面接软件包名称
$ a2 G# u3 [' S1 x' M& | apt-get --purge remove #配置文件也清理掉 命令后面接软件包名称" ^( @( w4 t b1 p: W3 q) W/ E
示范 以 删除 golang-1.13-go 软件包举例;* Z2 Y& }8 k8 G2 ^4 B/ T9 F
( E' q% X2 m/ i/ N( r1 r0 m root@localhost:~# apt-get purge golang-1.13-go, C# ]. `+ f' n2 R6 d! j
正在读取软件包列表... 完成
; R! B- g0 `9 |, ^1 l O 正在分析软件包的依赖关系树 + K; J, \6 p" [
正在读取状态信息... 完成 $ F! \9 H9 |- c) {6 H6 J
下列软件包是自动安装的并且现在不需要了:
2 h, ?$ @3 n; F5 y golang-1.13-race-detector-runtime golang-1.13-src golang-race-detector-runtime golang-src, ^3 E" x# {- }) i" h
使用'apt autoremove'来卸载它(它们)。# j9 `! B9 D" S: U8 V7 d9 f$ g
下列软件包将被【卸载】:
6 ~0 j" X; U& ]; g: \; f golang* golang-1.13* golang-1.13-doc* golang-1.13-go* golang-doc* golang-go*
3 D4 N& h+ ?* G/ J 升级了 0 个软件包,新安装了 0 个软件包,要卸载 6 个软件包,有 57 个软件包未被升级。- }8 O2 d; X% o4 o- l
解压缩后将会空出 230 MB 的空间。
8 ]6 d2 F/ N1 n0 e' u$ D 您希望继续执行吗? [Y/n] Y
3 x. o" {7 V) m 旧的内核清理
5 J# B8 Z3 f& F% a6 r8 V# z 查看当前使用的内核 V7 J/ U/ O& U2 b' B% I! T) E
* I3 i$ l1 r( b3 F* ` $uname -r7 F& ]8 A; _6 }8 R
5.4.0-60-generic
9 C% {0 N/ k$ `+ Q% ]1 J) u $dpigs -H --lines=20+ _: S* n) L- }1 ]% r2 K. h' R
74.1M linux-headers-4.14.91-bbrplus
( D. j( e4 j4 r8 C q. F 70.0M linux-modules-5.4.0-60-generic //保留
6 J& U- T9 {8 R+ J5 u- } 70.0M linux-modules-5.4.0-59-generic //保留
" a0 }5 Z' l5 \- O- G0 n ...
, M4 L" R/ {5 @, J 看看有没有不再用到的旧内核,然后使用 apt purge 清理它们(从最旧的开始);
8 Q8 A! k$ D2 R' ]
, s0 t* `1 R2 W( y) x $apt purge linux-headers-4.14.91-bbrplus! S: v" I; y2 I
运行以下命令 update-grub 来更新和重建 GRUB 配置(通常在内核删除时会自动执行,但手动运行可以双重保险):
: C2 ~. N- t; f" {
4 S) p' p8 O1 }2 v/ E% F" t* ~ $update-grub
; l7 T0 M+ z! n# i. @0 f: p Sourcing file `/etc/default/grub' S2 L* q8 i; ?# |/ @
Sourcing file `/etc/default/grub.d/init-select.cfg'5 ]/ _2 f3 [: u. R" \7 L
正在生成 grub 配置文件 ...
. \4 {9 \2 Y$ S6 H9 j% | 找到 Linux 镜像:/boot/vmlinuz-5.4.0-60-generic // 还在 ! I7 a. R8 |1 u0 |4 u
找到 initrd 镜像:/boot/initrd.img-5.4.0-60-generic- n9 \$ c0 Z u% E( X
找到 Linux 镜像:/boot/vmlinuz-5.4.0-59-generic
9 o, c2 }" g/ z0 k0 T5 I$ Q1 ~ 找到 initrd 镜像:/boot/initrd.img-5.4.0-59-generic
2 u* T6 r1 g# F& R0 F 找到 Linux 镜像:/boot/vmlinuz-5.4.0-58-generic$ `% G" j* i: {5 d& |* Q9 k
找到 initrd 镜像:/boot/initrd.img-5.4.0-58-generic
$ ~$ X1 ?) D* x9 F9 v' y _ 完成! u0 u* j( P7 Q8 d# j
...
( `: A$ o8 L4 {" [
- U6 Q% m( D! G' U 相关知识
[; E# z. x; O7 w LINUX的磁盘管理du命令详解8 @2 P+ @3 K; i5 Y3 E
' M4 M6 k& v9 g0 W* j6 w' d
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
% F; ^! i/ e2 X" }! S0 I
! b% I F" A, T) u0 \1 Z, f+ Z DU命令用途! V: k0 k0 L9 y$ @- o) E6 K+ }# T6 C
du(disk usage)命令可以计算文件或目录所占的磁盘空间。没有指定任何选项时,它会测量当前工作目录与其所有子目录,分别显示各个目录所占的快数,最后才显示工作目录所占总快数。
: W5 o0 m2 T+ P; ~ 7 ?7 E/ ^& W/ t/ F4 B
找出大文件
. \" u0 M1 v* d" P9 A 磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:
! S& ?" a) ~: J( X " m5 |% q5 b6 F& I) n( I! H
du -s /home/* | sort -nr #/home目录检测
: ~8 `6 u8 O6 W / D6 M, m) ^; M" i: V, h