添加用户
由于每台服务器都需要连接到 NAS,而且可能很多用户在不同的服务器上都有账号,这样的话就会导致 uid 冲突(不同服务器上不同用户的 uid 可能是一样的),因此,针对不同情况需要用到不同添加用户的方法:
- 该用户为新同学,说明他之前在其他服务器上没有账号,因此,先在 NAS 上为他开一个账号确保 uid 唯一性,再根据这个 uid 去其他的服务器上进行开号
- 该用户在其他服务器上有账号,那就直接根据他的 uid 进行开号,无需再经过一遍 NAS
开号方式使用命令 useradd
,默认情况下直接 useradd user1
就可以了,用户目录为 /home/user1
,但是考虑到服务器硬盘容量有限,最好将其划分到具有更大空间的目录如 /data
,因此使用如下命令进行自定义添加用户
$ useradd -u [uid] -d /data/user1 -m -s /bin/bash user1
选项 | 含义 |
---|---|
-u UID | 手工指定用户的 UID,注意 UID 的范围(不要小于 500)。 |
-d 主目录 | 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限; |
-c 用户说明 | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置; |
-g 组名 | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。 |
-G 组名 | 指定用户的附加组。我们把用户加入其他组,一般都使用附加组; |
-s shell | 手工指定用户的登录 Shell,默认是 /bin/bash; |
-e 曰期 | 指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段; |
-o | 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0; |
-m | 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的; |
-r | 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。 |
表格引自 http://c.biancheng.net/view/844.html
更新 CUDA
先装 CUDA [下载地址],老版本的 CUDA 不用删掉,直接让管理员将 cuda 软连接到最新的 CUDA 就行了,以防有些代码需要低版本 CUDA
再装驱动 [驱动下载地址],安装过程会提示说检测到老版本驱动,直接卸载就行了
常用命令
命令 | command |
---|---|
查看 GPU 使用状态 | nvidia-smi 、 gpustat -i (需 pip install gpustat) |
查看进程 | top、htop、ps -ef | grep [pid] |
查看服务器磁盘容量 | df -h |
查看自己占用服务器的容量 | du -h |
查看当前目录下文件个数 (不包含子目录) | ls -l | grep “^-“ | wc -l |
查看端口占用 (Linux) | lsof -i:PORT (没有空格) |
查看端口占用 (Windows) | 查看所有开放端口: netstat -ano 查看占用端口程序的 PID:netstat -aon | findstr “PORT” 查看占用端口的 PID 所对应的程序:tasklist | findstr “PID” 杀死占用端口的进程:taskkill /T /F /PID “PID” |
换源
pip 源
vim ~/.pip/pip.conf
[global]
index-url = https://pypi.doubanio.com/simple
trusted-host = pypi.doubanio.com
conda 源
vim ~/.condarc
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
迁移 conda 环境
有时候我们需要在机器上重新建一个 conda 环境,但是又不想重新装包,毕竟 pytorch 和 cuda 版本都跟之前的环境是一样的,所以可以直接从之前的环境中复制一份成为新环境,conda 是支持这样做的,以下命令就将 BBB 环境拷贝了一份成为 AAA 环境。
conda create -n AAA --clone BBB
如果涉及不同服务器之间装环境的话也一样,可以先将旧的环境拷贝到新的电脑,然后通过下面的命令创一个新的环境
conda create -n AAA --clone ~/path
可以使用 conda info -e
来查询机器上的所有 conda 环境以及对应所在的位置。
安装 anaconda 后默认用的是别人的环境
具体表现为我在 253 上面装完 anaconda 之后显示的 base 环境是师兄的,然后我能新建环境,但是我不能切换到我的环境,一直报错
mmdet /home/kevin/.conda/envs/mmdet
/home/kevin/anaconda3
base * /home/whqsx/anaconda3
torch_1.6 /home/whqsx/anaconda3/envs/torch_1.6
kevin@LabServer:~$ conda activate mmdet
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If your shell is Bash or a Bourne variant, enable conda for the current user with
$ echo ". /home/whqsx/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc
or, for all users, enable conda with
$ sudo ln -s /home/whqsx/anaconda3/etc/profile.d/conda.sh /etc/profile.d/conda.sh
The options above will permanently enable the 'conda' command, but they do NOT
put conda's base (root) environment on PATH. To do so, run
$ conda activate
in your terminal, or to put the base environment on PATH permanently, run
$ echo "conda activate" >> ~/.bashrc
Previous to conda 4.4, the recommended way to activate conda was to modify PATH in
your ~/.bashrc file. You should manually remove the line that looks like
export PATH="/home/whqsx/anaconda3/bin:$PATH"
^^^ The above line should NO LONGER be in your ~/.bashrc file! ^^^
上官网仓库找报错问题,只需要用一行代码就可以解决这个问题
source ~/anaconda3/etc/profile.d/conda.sh
conda activate my_env
挂载 NAS
其实就是将 NAS 上的目录映射到本地一个目录,所以新建一个目录叫做 /NAS_REMOTE
,用 apt 先安装 nfs-utils
,在 sudo vim /etc/fstab
在最底下添加一行 (前面是被挂载的目录,后面是本地挂载目录)
172.31.233.218:/share/CACHEDEV1_DATA/Public /NAS_REMOTE nfs defaults 0 0
之后再运行 sudo mount -a
,就能将 NAS 挂载上,以后重启机器的话也要运行一下这个命令进行挂载
挂载其他服务器 https://cshihong.github.io/2018/10/16/NFS%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA%E4%B8%8E%E9%85%8D%E7%BD%AE/
[root@localhost ~] sudo yum install -y nfs-utils
#安装nfs服务
[root@localhost ~] sudo yum install -y rpcbind
#安装rpc服务
[root@localhost ~] sudo systemctl start rpcbind #先启动rpc服务
[root@localhost ~] sudo systemctl enable rpcbind #设置开机启动
[root@localhost ~] sudo systemctl start nfs-server nfs-secure-server
#启动nfs服务和nfs安全传输服务
[root@localhost ~] sudo systemctl enable nfs-server nfs-secure-server
[root@localhost /] sudo firewall-cmd --permanent --add-service=nfs
success #配置防火墙放行nfs服务
[root@localhost /] sudo firewall-cmd --reload
successs
根目录满了怎么办
进入根目录,输入下列命令找到是哪个文件夹比较耗容量,一般都是 var/log
或者 /var/cache
sudo du -sh *
但是我们需要经常清理这些目录,比较麻烦,一劳永逸的方案是在 /var 中建立 cache、log… 的软链接,链接到一个磁盘比较充足的目录中。
批量 kill 进程
用 grep 配合 awk 可以轻易做到,awk '{print $2}'
表示输出第二列结果,在 ps 命令中就是进程的 id 号
ps -ef | grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
莫名其妙占用显存
有时候明明没人用卡,但是卡的显存却被占用了很多,也找不到卡上的进程,这是因为上一个用卡的人的程序退出了,但是又没完全退出,让这个用户输入下面命令就可以清空显存( 里面的 X 是 GPU 的 id 号 ),不过要注意,可能导致该用户所有 GPU 进程全部被终结,所以最好让该用户在没有使用 GPU 的时候输入命令
fuser -v /dev/nvidiaX | awk "{print $2}" | xargs kill -9
86只能被233网段的机器连接
有时候重启了 233.86 之后,会出现 ssh 连接不上的情况,但是 233.xx 的 ip 可以连接上,这是因为 86 用的默认网卡是一张有问题的卡(不知道是谁设置的),默认走的是这张网卡,使用 ip route
命令可以看到,如果第一行的 default 不是连接到学校内网的网卡的话,就是有问题的,需要用 ifconfig <网卡名> down
把这块网卡关掉,然后再 ip route
查看,第一行 default 变了的话就是成功了
根目录列表无法显示
具体表现为,在根目录输入 ls
命令之后一直卡死,按 CTRL+C
都退不出去,没错,我说的就是 189 服务器。然后就输入 df -h
想看看服务器的磁盘使用情况,依然卡死,无法退出。于是查看一下本地的磁盘使用,输入 df -hl
有正常的输出,那就说明本地的文件系统没有问题,那么就可能是挂载了其他服务器上的磁盘,因为其他服务器出了问题,导致 ls
的时候一直在等待这个服务器的响应。于是输入 mount
查看服务器是否有挂载其他服务器文件夹,出来两个文件系统,一个是我们的 NAS,一个是师兄自己的 NAS,分别 ping 他们的 ip,都能 ping 通,所以不存在机器关机的问题,然后分别进入这两个文件夹,发现师兄的 NAS 可以正常进入,而我们的 NAS 进不去,并且一直卡着,那么问题找到了,我们的 NAS 出了问题。
怎么解决呢,一个好的办法就是将他取消挂载,但是用 umount -f /NAS_REMOTE
的话会说 device is busy
,要用 umount -l /NAS_REMOTE
,这样就可以取消挂载,可以列出根目录列表了。随后检查一下 NAS,发现没有什么异常,在其他服务器取消挂载后再挂上去也一样正常,但是在 189 输入 sudo mount -a
重新挂载 NAS 后又会卡死,目前暂时未解决这个问题,估计重启后就可以了。
造成这种现象的原因是 nfs 服务器/网络挂了,nfs 客户端默认采用 hard-mount 选项,而不是 soft-mount。他们的区别是:
- soft-mount: 当客户端加载 NFS 不成功时,重试 retrans 设定的次数.如果 retrans 次都不成功,则放弃此操作,返回错误信息 “Connect time out”
- ard-mount: 当客户端加载 NFS 不成功时,一直重试,直到 NFS 服务器有响应。hard-mount 是系统的缺省值。
reference:
https://blog.csdn.net/Bronze5/article/details/79113378
https://blog.csdn.net/qq_36270681/article/details/104408077
https://blog.csdn.net/BrotherDong90/article/details/51735632
A100 突然之间用不了GPU
经常在 A100 上发生,突然之间用不了 GPU 了,具体表现为,torch 的 torch.cuda.is_available()
为 False,并且运行英伟达的示例程序也 return 一个错误代码。花了些时间找出这是什么造成的,这是 A100 独有的问题,因为它需要一个 fabricmanager
服务,但是这个服务经常会突然崩掉,所以我们又得将这个服务重新安装,然后再 enable 它,GPU 就能够正常使用了。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g') \
&& wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin \
&& sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub \
&& echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list \
&& sudo apt-get update
sudo apt-cache madison cuda-drivers-fabricmanager-450
sudo apt-get install -y cuda-drivers-fabricmanager-450
reboot
systemctl start nvidia-fabricmanager.service
systemctl enable nvidia-fabricmanager.service
服务器频繁重启
很勾巴烦,服务器好端端的自己重启,具体表现为 ping 不到 ip,ssh 断连,一段时间开机后恢复。开始以为是 GPU 出了什么问题,没人用 GPU 就会重启,然后发现用了 GPU 还是重启,于是找客服远程看看,最终还是没解决,不过学到了一些查看 Linux 系统日志的知识,记录一下。
首先,last
命令可以输出之前登陆过系统的用户的名字和登录时长,并且可以看到系统重启的时间。最后三行表示的是登陆时间、退出时间以及持续时间,注意倒数第二行,如果是正常重启的话就是 down
,电源强制重启的话就显示 crash
,可以看到我们这里很多个 crash
,所以系统可能有点问题。
lzr pts/3 172.29.3.101 Tue Aug 31 11:46 still logged in
lzr pts/2 172.29.3.101 Tue Aug 31 11:46 still logged in
lzr pts/1 172.31.71.85 Tue Aug 31 11:33 still logged in
lzr pts/0 172.29.3.101 Tue Aug 31 11:00 still logged in
reboot system boot 3.10.0-1160.6.1. Tue Aug 31 18:56 - 20:13 (01:16)
lzr pts/12 172.29.3.101 Tue Aug 31 10:53 - 10:54 (00:00)
lzr pts/12 172.29.3.101 Tue Aug 31 10:53 - 10:53 (00:00)
lzr pts/12 172.29.3.101 Tue Aug 31 10:53 - 10:53 (00:00)
lzr pts/12 172.29.3.101 Tue Aug 31 10:53 - 10:53 (00:00)
lzr pts/12 172.29.3.101 Tue Aug 31 10:53 - 10:53 (00:00)
lzr pts/11 172.29.3.101 Tue Aug 31 10:47 - crash (08:09)
lzr pts/10 172.29.3.101 Tue Aug 31 09:43 - crash (09:13)
lzr pts/9 172.29.3.101 Tue Aug 31 03:10 - crash (15:46)
lzr pts/5 172.31.71.186 Mon Aug 30 21:39 - crash (21:17)
lzr pts/4 172.31.71.186 Mon Aug 30 21:37 - crash (21:19)
lzr pts/0 172.31.71.85 Mon Aug 30 21:13 - crash (21:43)
reboot system boot 3.10.0-1160.6.1. Tue Aug 31 05:03 - 20:13 (15:10)
lzr pts/6 172.31.71.85 Mon Aug 30 16:55 - 16:55 (00:00)
lzr pts/6 172.31.71.85 Mon Aug 30 16:55 - 16:55 (00:00)
lzr pts/5 172.31.71.85 Mon Aug 30 14:38 - crash (14:25)
guanhua_ pts/4 172.31.108.76 Mon Aug 30 14:02 - crash (15:01)
lzr pts/1 172.31.71.186 Mon Aug 30 10:41 - crash (18:22)
lzr pts/0 172.31.71.186 Mon Aug 30 10:40 - crash (18:22)
知道系统有问题之后我们可以去查看系统日志,一般在 /var/log/messages
里面,ubuntu 的话在 /val/log/syslog
里面,这个文件记录了系统的一些情况,但是看着也没啥能跟重启有关的问题。
Aug 31 20:15:18 localhost systemd: sshd.service start operation timed out. Terminating.
Aug 31 20:15:18 localhost systemd: Failed to start OpenSSH server daemon.
Aug 31 20:15:18 localhost systemd: Unit sshd.service entered failed state.
Aug 31 20:15:18 localhost systemd: sshd.service failed.
Aug 31 20:15:26 localhost kernel: NFSD: client 172.31.234.159 testing state ID with incorrect client ID
Aug 31 20:15:26 localhost kernel: NFSD: client 172.31.234.159 testing state ID with incorrect client ID
Aug 31 20:16:00 localhost systemd: sshd.service holdoff time over, scheduling restart.
Aug 31 20:16:00 localhost systemd: Stopped OpenSSH server daemon.
Aug 31 20:16:00 localhost systemd: Starting OpenSSH server daemon...
Aug 31 20:16:01 localhost dbus[1413]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)
Aug 31 20:16:01 localhost systemd: Created slice User Slice of root.
Aug 31 20:16:01 localhost systemd: Started Session 633 of user root.
Aug 31 20:16:01 localhost systemd: Removed slice User Slice of root.
Aug 31 20:16:01 localhost dbus[1413]: [system] Successfully activated service 'org.fedoraproject.Setroubleshootd'
Aug 31 20:16:02 localhost setroubleshoot: failed to retrieve rpm info for /usr/local/lib/libnss-2.1.2.so
因为我们这种情况可能是系统崩溃,所以还可以去查看系统崩溃报告,在 /var/crash/xxx
里面有系统崩溃时的内核报告,给出了崩溃时的 core dump,这东西得专业的人来看才看得懂。
[49827.892064] Call Trace:
[49827.892891] <IRQ>
[49827.893018] [<ffffffffc1a1d15c>] ? os_get_current_tick+0x2c/0x60 [nvidia]
[49827.894890] [<ffffffffc1e7cd3c>] ? _nv035997rm+0x2c/0x90 [nvidia]
[49827.895801] [<ffffffffc1a4e761>] ? _nv009219rm+0x6d1/0x710 [nvidia]
[49827.896702] [<ffffffffc1a4f57c>] ? _nv036101rm+0x2c/0x120 [nvidia]
[49827.897638] [<ffffffffc1a98883>] ? _nv032953rm+0x33/0x1a0 [nvidia]
[49827.898519] [<ffffffffc1a0d470>] ? nvidia_frontend_ioctl+0x40/0x40 [nvidia]
[49827.899451] [<ffffffffc22d84e6>] ? rm_run_rc_callback+0x86/0xd0 [nvidia]
[49827.900332] [<ffffffffc1a0dfdc>] ? nvidia_rc_timer_callback+0x3c/0x60 [nvidia]
[49827.901210] [<ffffffffc1a0d47d>] ? nv_timer_callback_typed_data+0xd/0x10 [nvidia]
[49827.902003] [<ffffffffac8abd58>] ? call_timer_fn+0x38/0x110
[49827.902868] [<ffffffffc1a0d470>] ? nvidia_frontend_ioctl+0x40/0x40 [nvidia]
[49827.903660] [<ffffffffac8ae1ed>] ? run_timer_softirq+0x24d/0x300
[49827.904438] [<ffffffffac8a4b95>] ? __do_softirq+0xf5/0x280
[49827.905199] [<ffffffffacf984ec>] ? call_softirq+0x1c/0x30
[49827.905954] [<ffffffffac82f715>] ? do_softirq+0x65/0xa0
[49827.906709] [<ffffffffac8a4f15>] ? irq_exit+0x105/0x110
[49827.907447] [<ffffffffacf99a88>] ? smp_apic_timer_interrupt+0x48/0x60
[49827.908171] [<ffffffffacf95fba>] ? apic_timer_interrupt+0x16a/0x170
[49827.908876] <EOI>
在知道服务器是由于崩溃导致重启之前,我怀疑过系统是不是被黑客入侵了然后留了个定时关机脚本,我查看 crontab
里面发现没有,然后我又觉着网络上行流量好大,是不是黑客留下了某个程序在一直往外面发送文件,于是我查询有没有根据进程名显示流量占用量的程序,然后找到了 nethogs
这个工具,最终发现,这么大的流量是因为我将服务器的一个目录映射成了 NFS 服务器,它在和客户端进行数据传输。
查询了 google 上的相关问题,很少有人出现我这种情况,但是出现这种情况的都是电源出了问题,所以我猜测也应该是电源出了问题,要么就是机房电压不稳。打电话让工程师过来机房看了一下,发现有根电源线已经快掉了,然后给他插紧了,应该是这个原因导致的。
给服务器加硬盘
TODO,还没有试过
[Linux服务器增加硬盘操作记录 | Yunfeng’s Simple Blog (vra.github.io)](https://vra.github.io/2017/02/24/linux-add-disk/) |
PyCharm无法列出目录
有一天,skh 的电脑莫名其妙出现这个问题,网上查都查不到是什么原因
[2021/9/17 23:26] Upload to kevin@172.31.233.142:22 (3)
[2021/9/17 23:28] Upload to kevin@172.31.233.142:22 (3) failed: could not list the contents of folder "sftp://172.31.233.142/". (Timeout expired)
[2021/9/18 21:17] Upload to kevin@172.31.233.142:22 (3)
[2021/9/18 21:19] Upload to kevin@172.31.233.142:22 (3) failed: could not list the contents of folder "sftp://172.31.233.142/". (Timeout expired)
我想起上次师妹好像也有这个问题,也没解决,然后众人和 skh 搞了一晚上,尝试过卸载 PyCharm,未果,就差重装系统了。大伙们都以为是 skh 的 PyCharm 有问题,他本人也如是觉着,走前我用我的 PyCharm 上传文件到服务器,结果发现也出了这个错误,竟然出现了机传机现象!而且用 PyCharm 的都中招了!起初人们以为这只是一个小 bug,直到自己的 PyCharm 也打不开了才不得不重视起来,连夜找 VSCode 的替代方案,结果发现 VSCode 还确实能够做到一份代码同步到多个服务器上,这个我以后专门写一份教程。第二天,在我和 jlchen 讨论出一个曲线救国的 VSCode 环境配置之前,我觉得 VSCode 多台服务器远程开发还是有缺点,还是 PyCharm 更香,于是我又去找了上面那个报错的原因,其中一份解决方案里面提到了根目录,如果要将 remote 资源列出来的话,要从根目录列,这时候我突然想起来!我有台服务器用作 NAS 存数据了,所以很多服务器上都挂了我的这个 NAS,但是我这台 NAS 在昨天下午被意外关机了,一直没有开机。上次我在 189 上就有这个问题,最后把挂载的服务器取消挂载就行了,没想到这次可能又是这个问题,只不过换了种形式,我马上去实验室服务器上 ls /
列一下根目录,果然,卡住了!这波不是 PyCharm 的锅,是我的锅,把 NAS 卸载就行了,继续拥抱 PyCharm。
重启机器后硬盘丢失
有时机器重启或者关机后,再次开机就找不到某块硬盘了,这时候我们需要手动去挂载他,找到丢失的硬盘的位置,然后再挂载,主要是找到硬盘编号比较重要,一般是 sdb,sda 之类的代号,可以通过 sudo fdisk -l
查找,如果是未挂载的硬盘是查看不到里面的文件的。
sudo mount /dev/sdb /mnt/nas/
查看内存占用
输入 ps aux | sort -k4nr | head -n 5
查看占用内存最多的前 5 个进程,或者也可以通过 top
命令后按住 M
来对内存占用进行排序,两个都可以。利用 ps -aux
或者 top
命令也可以查看到具体的占用多少 G 内存,举个例子,这是 top
命令的界面,%MEM
就是内存的占用量,对 250508
这个进程来分析一下,它的占用率是 2.1%,我们服务器内存大概是 504G,得出这个进程占用了大约 10.6G 的内存
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
250508 wubizhu 20 0 92.497g 0.010t 88056 S 0.0 2.1 0:32.10 python
250593 wubizhu 20 0 92.498g 0.010t 87900 S 0.0 2.1 0:29.64 python
225884 xjheng 20 0 49.620g 0.010t 6.367g S 4.8 2.0 57:06.42 python
83813 xjheng 20 0 52.932g 6.760g 3.045g R 101.9 1.3 205:04.84 python
252689 zxdong 20 0 14.935g 4.106g 83604 D 2.6 0.8 22:00.05 python
252681 zxdong 20 0 14.935g 4.106g 83608 D 30.4 0.8 22:18.04 python
13646 xjheng 20 0 17.928g 4.022g 1.127g D 22.7 0.8 1:29.93 python
验证一下说法,通过 ps -aux | grep 250508
得到下面结果,第六列 10944660
就是占用的物理内存,单位是 k,所以这里统计出的是 10.9G,跟我们算出来的差不多
wubizhu 250508 1.8 2.0 96990572 10944660 pts/131 Sl+ 11:50 0:42 python xx.py
通过 cat /proc/250508/status
也能得到进程的内存占用量,VmRSS
就是物理内存使用量,单位也是 k
Name: python
Umask: 0002
State: S (sleeping)
Tgid: 250508
Ngid: 250508
Pid: 250508
PPid: 38642
TracerPid: 0
Uid: 1074 1074 1074 1074
Gid: 1074 1074 1074 1074
FDSize: 128
Groups: 1074
NStgid: 250508
NSpid: 250508
NSpgid: 38642
NSsid: 9950
VmPeak: 97005580 kB
VmSize: 96990572 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 10961980 kB
VmRSS: 10944656 kB
BMC 相关 (TODO)
BMC是一个独立于服务器系统的小型操作系统,作用是方便服务器远程管理、监控、安装、重启等操作。BMC接通电源即启动运行,由于独立于业务程序不受影响,避免了因死机或者重新安装系统而进入机房。
BMC只是一个集成在主板上的芯片(也有通过PCIE等各种形式插在主板上),对外表现形式只有一个标准RJ45网口,拥有独立IP。普通维护只需使用浏览器访问IP:PORT登录管理页面,服务器集群一般使用BMC指令进行大规模无人值守操作。
一般服务器BMC网口是独立的,仔细看印有BMC字样。但是也有小型服务器BMC网口和通信网口是二合一的。
当然也有不叫BMC的,只要遵守IPMI协议,都是类似的。
https://www.cnblogs.com/lianyg/p/9370625.html
显卡监控
因为之前服务器上经常有人一下就用很多卡,导致别人没卡跑,所以我写了个监控脚本在我管理的服务器上,每个人最多能占用两张卡的显存,超过的话就将程序给 kill 了,维护一个良好的秩序。
import os
import re
import time
users = 'root,florence,jeffin,jinziqi,jlchen,kevin,lmm,luocheng,weizeng,wubizhu,xiaox,xjheng,yuxuan,zsting,zxdong'.split(',')
def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text
while True:
info = execCmd('gpustat -cpu | grep python | awk \'{for(i=13;i<=NF;i++) printf $i""FS;print ""}\'')
pc_info = info.split('\n')
pc_info = [x for x in pc_info if x != '']
user_dict = dict([(user.strip(), dict()) for user in users ])
for i, mem_info in enumerate(pc_info):
one_card_info = mem_info.split(' ')
one_card_info = [x for x in one_card_info if x != '']
for val in one_card_info:
user = val[:re.search(':', val).span()[0]]
gpu_mem = val[re.search('\(', val).span()[1]: -2]
pid = val[re.search('/', val).span()[1] : re.search('\(', val).span()[0]]
if pid in user_dict[user].keys():
user_dict[user][pid] += int(gpu_mem)
else:
user_dict[user][pid] = int(gpu_mem)
for user, info in user_dict.items():
user_mem = 0
for pid, mem in info.items():
user_mem += mem
if user_mem > 81074:
os.system(f'kill {pid}')
t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f'==> {t} | Killed {user}: {pid}')
time.sleep(10)
服务器被黑应急响应
- 首先查看进程是哪个用户造成的,看看该任务是否有 crontab 定时任务,不要急着把程序 kill 掉,有 crontab 的话把 crontab 里面的东西删掉,把脚本文件也删掉
- 用 last 命令查看这个用户从哪个 ip 登录上服务器的,指不定是学校的内鬼或者其他肉鸡
- 改密码,把弱密码给改了,通常爆破弱密码登录的可能性十分大,很多人用的都是默认和 id 一样的密码
- 如果是新建的用户则删除用户,并且禁止该用户通过 ssh 登录服务器,如果知道 ip 的话顺便把 ip 也给禁了
- 毕了业的师兄师姐的账号 userdel ,删除用户之后东西都还在,只是不能通过 id 登录了
sudo vim /etc/ssh/sshd_config
(在里面添加一行 DenyUsers user1 user2)
sudo systemctl restart sshd.service
(重启 sshd 使改动生效)
sudo journalctl -xe
(查看重启日志)
查看最近用户登录情况
命令 | 日志文件 | 功能 |
---|---|---|
last |
/var/log/wtmp | 所有成功登录/登出的历史记录 |
lastb |
/var/log/btmp | 登录失败尝试 |
lastlog |
/var/log/lastlog | 最近登录记录 |
如果想清除记录的话直接 echo > /var/log/wtmp
写入空文件就行
This account is currently unavailable
症状:用某个用户的 id 和密码进行 ssh 登陆,然后就报了这个错误,开始以为是这个用户被删除了,然后看了一下并没有,后来查了一下,发现这用户被禁止登陆了,cat /etc/passwd | grep user
,发现他的 shell 是 /sbin/nologin
,将其改成 /bin/bash
就可以了,所以学到了一招,以后想禁止哪个用户登陆直接修改他的 shell 为 /sbin/nologin
就行了。
233 网段多台服务器没关机但是连不上
这个很难发现,233网段好多台机器都连不上了,但是有些又是好的,具体情况是有些机器网口没有亮灯,有些闪烁橙色灯,重启了也不行,所以怀疑就是网络问题,经过万总的经验,判断出来网口连着的交换机灯没有亮,判断是这台交换机有问题,然后换了一台好的交换机还是不行,这时想起来我们连着的交换机可能是这条线路汇总的总交换机,总的都没用,插其他的肯定也不行,最后就将那台交换机给开机了,然后这条线上的所有机器都好了。
安全相关
- 除非有特殊需要,否则禁止普通用户的 docker 权限!
- 设置密码时不要太简单,应使用大小写字母加数字加特殊字符的组合
- 校外访问如需用到内网穿透服务(如 frp,ngork 等),配置连接时应使用加密协议
某运维工程师的记录 https://zhuanlan.zhihu.com/p/441837141
批量修改用户密码
修改 UID 从 1000 到 2000 的用户密码,以 $username:$password
形式保存到文件中。
log=chpw.log
> $log
for username in `awk 'FS=":" {if ($3 >= 1000 && $3 < 2000) print $1}' /etc/passwd`; do
password=`openssl passwd $RANDOM`
echo $password | passwd --stdin $username &> /dev/null
echo -e "$username:$password" >> $log
done
然后用 chpasswd < chpw.log
来修改就行了,记得把脚本和 log 删除掉
TODO
设置 ip 白名单内的 ip 才能使用密码登陆,其他不能登陆
https://www.jianshu.com/p/5a13d6b0fa0a
远程日志 rsyslog,rootkit 检测工具 rkhunter