跳到主要内容

Linux 操作系统问题解决

1、设备上没有空间 No Space left on device

问题原因可能有

  1. block 满
  2. inode 满
  3. 文件被占用,没有释放

排查

查看 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_counti_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