Linux 操作系统问题解决
1、设备上没有空间 No Space left on device
问题原因可能有
- block 满
- inode 满
- 文件被占用,没有释放
排查
查看 block 使用情况
df -h
查看 inode 使用情况
df -i
查看被删除的文件是否被占用
lsof | grep deleted
解决
删除不必要的文件,释放空间。
2、删除文件之后,为什么磁盘空间并没有减少?
使用 df
命令可以查看磁盘占用情况。
统计当前目录下文件大小,并按照大小排序
du -sm * | sort -nr
通过 rm xxx.log
来删除文件
通过 ls
命令发现文件已经删除,但是通过 df
命令观察磁盘使用率并没有减少。
通过下面的命令可以查找所有已打开文件,并筛选出其中已删除状态的文件。
lsof |grep deleted
通过 kill
命令终止读取 xxx.log
文件的进程即可释放空间。
背景知识
Linux 系统中是通过 link 的数量来控制文件删除的,只有当一个文件不存在任何 link 的时候,这个文件才会被删除。
一般来说,每个文件都有 2 个 link 计数器
: i_count
、i_nlink
i_count
表示当前文件使用者(或被调用)的数量i_nlink
表示介质连接的数量(硬链接的数量)- 可以理解
i_count
是内存引用计数器,i_nlink
是磁盘引用计数器。
当一个文件被某一个进程引用时,对应 i_count
数就会增加;当创建文件的硬链接的时候,对应 i_nlink
数就会增加。
在Linux或者Unix系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),实际上就是减少磁盘引用计数 i_nlink
,但是并不会减少 i_count
数。
如果一个文件正在被某个进程调用,用户使用 rm
命令把文件"删除"了,这时候通过 ls
等文件管理命令就无法找到这个文件了,但是并不意味着这个文件真正的从磁盘上删除了。
因为还有一个进程在正常的执行,在向文件中读取或写入,也就是说文件其实并没有被真正的"删除",所以磁盘空间也就会一直被占用。
而我们的线上问题就是这个原理,因为有一个进程正在对日志文件进行操作,所以其实 rm 操作并没有将文件真正的删除,所以磁盘空间并未释放。
3、sshd 配置
1、通过配置 ~/.ssh/config 文件来指定私钥
错误信息:bad permissions
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0664 for '/home/xxx/.ssh/xxx_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/xxx/.ssh/xxx_rsa": bad permissions
问题原因:秘钥的权限不对,应该改为 600
,执行命令 chmod 600 xxx_rsa
2、修改 SSH 端口
vim /etc/ssh/sshd_config
# 把 Port 22 改成其他的端口
# 以后在连接的时候,通过 -p 来指定端口
3、使用 ssh 远程其他机器的时候,如果一段时间没有操作,就会假死,即不能操作了
vim /etc/ssh/sshd_config
# 插入
ClientAliveInterval 30
ClientAliveCountMax 6
# 修改之后需要重启 sshd 服务
systemctl restart sshd
4、生成 rsa
ssh-keygen -t rsa
生成的文件会存放到 /root/.ssh 中
私钥:idea_rea ,公钥:idea_rsa.pub
5、免密登录
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
生成 rsa 秘钥
ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/git_id_rsa
配置 /etc/ssh/sshd_config
PubkeyAuthentication yes
6、设置允许使用密码登录
# 设置为允许通过密码登录
vim /etc/ssh/sshd_config
> PasswordAuthentication Yes
# 重启 sshd 服务
systemctl restart sshd
7、删除 known_hosts 中的指定记录
ssh-keygen -R cc
8、通过 ssh user@hostname
登陆时,默认使用 ~/.ssh/id_rsa
密钥。
9、通过 ssh
远程执行脚本
cd $(dirname $0)
# 带上 /bin/bash 可以避免每次执行的时候都会输出
# Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh cloud /bin/bash << EOF
# 注意,等号两边不能有空格
current_date=$(date +"%Y-%m-%d")
# 需要加上 \ 进行转义
echo "当前日期:"\$current_date
EOF
10、禁用密码登录
/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM no
如果配置了并且重启了 ssh 服务,但是还是能通过密码登录。
检查 /etc/ssh/sshd_config.d
下是否有其他文件。
腾讯云下 /etc/ssh/sshd_config.d/
下有一个 50-cloud-init.conf
文件,里面配置了 PasswordAuthentication yes
,需要修改为 no
。
11、alias
alias cls='clear'
alias ls='ls -alF --ignore=. --ignore=.. --color=auto --group-directories-first'
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
12、修改 hostname
hostnamectl set-hostname 4c8g