Linux 运维手册

基于 CentOS 系统

一、常见操作

1)文件操作

命令 描述
ls 列出当前文件夹下的文件
ls -alh 列出包括隐藏文件在内的所有文件,显示详细信息,并以人类可读的方式显示占用的磁盘空间大小
touch [FILE] 创建文件
vim [FILE] 打开文件
cat [FILE] 打印文件
head [FILE] 打印文件头 10 行,展示 20 行用 head -n 20 [FILE]
tail [FILE] 打印文件尾 10 行,展示 20 行用 tail -n 20 [FILE]
tail -f [FILE] 实时查看文件的末尾新增的内容,一般用于打印监控日志
less [FILE] 打印文件,可以用 上键 下键 翻页
rm [FILE] 删除文件
rm -rf [DIR] 递归删除路径DIR下所有文件
mv [FILE_A] [FILE_B] 文件FILE_A改名为FILE_B
mv [FILE] [DIR] 文件FILE移动到路径DIR
cd [PATH] 打开目录PATH
mkdir [PATH] 创建目录
mkdir -p [PATH/TO/DIR] 创建多级目录
tar cvf file.tar ./data data 目录 压缩成 file.tar 文件
tar xvf file.tar 解压 file.tar 文件

2)网络操作

命令 描述
lsof -i 列出所有与网络连接有关的进程及其打开的端口信息
lsof -i :[PORT] 列出特定端口的进程信息
lsof | grep deleted 列出占用未被正确删除的文件的句柄的进程
ifconfig 查看有效的网络接口的状态
ifconfig -a 查看所有的网络接口的状态
arp -a 查看局域网中设备的ip地址
ping [SERVER_IP] 检查远端服务器连通性
telnet [SERVER_IP] [SERVER_PORT] 检查远端服务器的端口的连通性
hostname -I awk ‘{print $1}’
wget [URL] 下载文件到当前路径
curl [URL] 访问网页
netstat -tnpl 显示TCP类型的端口
netstat -unpl 显示UDP类型的端口
netstat -r 显示路由表信息
netstat -g 显示多重广播功能群组组员名单
netstat -s 显示按协议分类统计信息
netstat -l 显示所有监听端口
netstat -n 使用域名解析,将域名解析成ip地址
netstat -p 显示程序名和进程PID
netstat -t 显示所有的tcp协议的端口
netstat -u 显示所有的udp协议的端口
ssh -p [SERVER_PORT] [USER]@[SERVER_IP] ssh连接远端服务器
ssh-keygen -R [SERVER_IP] 同IP机器重装后重连前注销老host
dig [example.com] 是 Linux 系统用于查询 DNS 信息的工具

3)系统操作

命令 描述
top 查看CPU占用率
hostname 查看主机名
uname -m 查看linux架构
uname -a 查看系统详细信息
cat /etc/centos-release 查看centos版本
ps aux 查看进程
ps -ef 查看进程
kill -9 [PID] 杀掉进程[PID]
df -h 查看磁盘空间
du -h / | sort -rh 根据文件磁盘占用倒排
du -h –max-depth=1 查看当前目录占用的磁盘空间大小
history 查看历史命令
type [CMD] 查看命令所在路径,如type mkdir
echo $LANG 查看字符编码
su - 切换到root用户
pip cache purge pip缓存清理
conda clean –all conda缓存清理

4)文本处理

命令 描述
awk 取列
awk -F 指定分割符取列
grep -v 查找不包含特定匹配模式的行
wc -l 输出文件的行数
echo “ABC” > [FILE] 将文本ABC写入文件FILE行尾
echo “ABC” » [FILE] 用文本ABC覆写文件FILE

5)Bash 表达式

命令 描述
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于
!
== 等于
=~ 正则匹配,等式右侧写正则表达式
-a file 如果file存在则为真
-d file 如果file存在且为目录则为真
-f file 如果file存在且为普通文件则为真
sleep 1m 休眠一分钟
export PATH=[/some/new/path]:$PATH 新增环境变量/some/new/path
$# 保存传递给shell脚本的命令行参数的数量
$* 保存所有传递给shell脚本的命令行参数 ($1 $2 …)
$@ 保存所有传递给shell脚本的命令行参数 ("$1" “$2” …)
$0 保存shell脚本的名字
$? 保存上一个执行的命令的退出码
set -x 脚本调试命令,会打印当前脚本执行的所有命令及其参数

6)vim 命令

以下命令需用 vim 打开文件,再按 esc 后输入,再按 enter 执行

命令 描述
a 切换到编辑模式。唯独这个直接按a就行,不用先按esc
:q 退出文档,不保存
:q! 强制退出文档
:x 保存后退出
:wq! 强制保存退出
:set paste 切换到粘贴模式
/[TEXT] 查找[TEXT],按n下一个
:help 打开帮助文档

7)GPU 命令

命令 描述
nvidia-smi 显示 GPU 摘要信息

二、后台运行

后台运行 Bash 命令的两种方式:

  1. [CMD] &: 后台运行,关掉终端会停止运行
  2. nohup [CMD] &: 后台运行,关掉终端不会停止运行

三、快捷指令

在 MacOS 终端用 短指令 替代 长指令,可以用 alias,步骤如下:

首先打开 ~/.bash_profile 配置文件,添加以下内容:

# alias
# remote server
user=[REMOTE_SERVER_USERNAME]
ip=[REMOTE_SERVER_IP]

alias login="ssh -p 22 ${user}@${ip}"
alias jupyter="ssh -L9999:localhost:8888 ${user}@${ip}"

然后在终端运行:

source ~/.bash_profile

此时,loginjupyter 两个短指令,就能替代等式右侧的两个长指令了。

Note: CentOS 系统同理,区别是 CentOS 的配置文件是 ~/.bashrc

四、用户系统

创建 一个系统用户,其中 -m (–create-home) 参数可选。

# 创建用户使用如下命令
useradd [USERNAME]
# 或
useradd -m [USERNAME]

选项 -m 代表创建用户时,为用户创建 /home/[USERNAME] 目录。

验证 系统用户是否存在:

id [USERNAME]

改密

passwd [USERNAME]

删除 系统用户:

userdel [USERNAME]

切换 系统用户:切换到用户 [USERNAME]

su [USERNAME]

五、环境部署

1)更新 yum

yum update -y
yum upgrade -y

yum --version

2)安装 java

yum install -y java-1.8.0-openjdk

# 验证 java 是否安装成功
java -version  

3)安装 pip3

yum install epel-release
yum install python3-pip
pip3 install --upgrade pip

# 验证 pip3 是否安装成功
pip3 --version

4)安装 jupyternotebook

pip3 install jupyter notebook

# 验证 jupyter notebook 是否安装成功
jupyter notebook --allow-root

5)安装 miniconda3

参考:docs.conda.io

# 安装
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

# 初始化 bash 文件
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh

# 使 bash 文件生效
source ~/.bashrc

# 验证 miniconda3 是否安装成功
conda info --envs
which python

# 打开 jupyter notebook
jupyter notebook
jupyter notebook --allow-root  # 在 root 环境打开
nohup jupyter notebook --allow-root &  # 在后台挂着

6)安装 rust

参考:rust-lang.org

# 安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

运行 vim ~/.bashrc,将以下内容添加到 .bashrc 文件中

rust_bin=~/.cargo/bin
if [[ ! $rust_bin =~ [*$PATH*] ]]; then
    export PATH=$rust_bin:$PATH
fi

运行 source ~/.bashrc,以初始化环境变量

Note: 卸载 rustup

rustup self uninstall

7)miniconda3 换 Kernal

安装依赖

pip install ipykernel

创建虚拟环境

conda create -n py27 python=2.7  # 创建名为 py27 的 Python 2.7 新环境
conda activate py27  # 激活新环境

# 为当前 Python 环境安装 ipykernel
python -m pip install ipykernel

# 将新环境加入 jupyter notebook 的 kernel 中
python -m ipykernel install --user --name py27 --display-name "Python (py27)"

随便创建一个 .ipynb 文件,在导航栏点击:Kernel -> Change Kernel -> Python (py27)

检查新 kernel 是否生效,在 jupyter notebook 运行

import sys
sys.executable

输出:'/home/[USER_NAME]/miniconda3/envs/py27/bin/python'

六、文件传输

1)使用 SCP

用于 远端服务器 之间互传文件。

scp [SOURCE_FILE] [USERNAME]@[DESTINATION_SERVER_IP]:[/PATH/TO/DIR]

上述命令的含义是:

把当前路径下的 [SOURCE_FILE] 文件 传到 [DESTINATION_SERVER_IP] 主机[USERNAME] 用户[/PATH/TO/DIR] 目录 下。

举个栗子 (=゚ω゚)= 🌰

scp data.tar jane@:132.43.75.194:/home/jane/code

注意:SCP 只能传单个文件,不能传文件夹。传文件夹可以把它压缩成 tar 文件再传

2)使用 rcsz

用于 远端服务器 与 本地电脑 互传文件。

安装依赖:

yum -y install lrzsz

传输命令:

  • rc (receive zmodem): 上传到服务器
  • sz (send zmodem): 下载到本地

常见参数:

  • -a: 以文本形式传输 (ASCII),如果可以确认传输的是文本,可选此参数
  • -b: 以二进制形式传输 (BINARY)
  • -e: 对控制字符转义,以保证文件传输正确

可以用 rc --help 查看更多参数。

Note: rc sz 需要配合客户端使用

  • Windows 推荐用 Xshell
  • MacOS 推荐用 SecureCRT

3)使用 Samba

用于 远端服务器 与 本地电脑 互传文件。

查看是否已经安装 Samba

  • CentOS: rpm -qa | grep samba
  • Ubuntu: dpkg -l | grep samba

① 安装依赖

  • CentOS: yum install -y samba samba-client samba-common
  • Ubuntu: sudo apt install -y samba samba-client

请确保系统至少有一个用户,以下命令用于确认是否有名为 [USER] 的用户:

id [USER]

> uid=1000([USER]) gid=1000([USER]) groups=1000([USER])

② 创建 Samba 用户,Samba 用户必须是系统实际存在的用户

为用户设置 Samba 密码

smbpasswd -a [USER]

按提示要求,输入 Samba 账号密码即可。

  • 查看 Samba 服务器中已拥有哪些用户: pdbedit -L
  • 删除 Samba 服务中的某个用户: smbpasswd -x [用户名]

③ 创建分享文件夹

在目录 /share/ 下新建名为 sambashare 的文件夹

mkdir -p /share/sambashare

修改分享文件夹的权限

chmod 777 /share/sambashare

④ 修改 Samba 配置文件

运行 vim /etc/samba/smb.conf 打开配置文件,并添加以下内容,注意 valid users 是指定允许访问的用户。

[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

[sambashare]
        comment = share folder
        path = /share/sambashare
        browseable = yes
        writable = yes
        read only = no
        guest ok = yes
        create mask = 0777
        directory mask = 0777
        public = yes
        valid users = root

⑤ 重启 Samba 服务

CentOS 6

$ sudo systemctl restart smb
$ sudo systemctl enable smb

CentOS 7

$ sudo systemctl start smb.service     # 启动 samba
$ sudo systemctl restart smb.service   # 重启 samba
$ sudo systemctl enable smb.service    # 设置开机自动启动
$ sudo systemctl status smb.service    # 查询 samba 状态

Ubuntu 16.04.3

$ sudo service smbd restart

重启后检查 smb 服务是否启动,两种方法:

1)用 systemctl

# 查询 Samba 服务的状态
$ systemctl status smb

2)用 smbclient

smbclient //localhost/sambashare -U root

输入 smb 用户密码,如果显示 smb: \> 则表示成功。

⑥ 端口加白

查看 Samba 服务占用的端口:

netstat -tnpl | grep smb  # TCP 端口
netstat -unpl | grep smb  # UDP 端口

然后在 PaaS 服务供应商处为对应端口加白。

⑦ 测试端口连通性

在本地命令行执行以下命令,确认远端服务器的端口可连通:

telnet [SERVER_IP] [SERVER_PORT]

⑧ 本地电脑连接 smb 服务

MacOS 系统:在访达中输入快捷键 CMD+K 打开 Connect to Server 页面

输入 smb://[YOUR_SERVER_IP]/sambashare 点击 Connect 连接你的 smb 服务。

Windows 系统:在文件地址导航栏输入 \\[YOUR_SERVER_IP] 后回车。

七、例行任务

查看 例行任务配置文件:

crontab -l

修改 例行任务配置文件:

crontab -e

例行任务的执行时间:

  • 定时任务的执行时间由 5 个值决定,形如 1 3 * * *
  • 5 个值的含义分别是:[minute] [hour] [day of month] [month] [day of week]
  • 表达方式:
    • *: 代表每一(天)执行,取值 1, 2, 3, …
    • */2: 代表每两(天)执行,取值 0, 2, 4, …
    • 3-5: 代表取值 3, 4, 5

下面是五个例子:

1 3 * * *  [CMD]   # 每天凌晨 3 点 1 分执行任务
1 3 * * 2-4  [CMD]   # 周二、周三、周四的凌晨 3 点 1 分执行任务
1 3 15 * *  [CMD]   # 每个月 15 号的凌晨 3 点 1 分执行任务
0 */2 * * *  [CMD]   # 每隔两个小时,在整点执行任务,时间取 0点、2点、4点 ...
1 3 15 3 *  [CMD]   # 每年 3 月 15 号的凌晨 3 点 1 分执行任务

可以在 crontab.guru 上调试。

Note: 注意,cron 不在命令行环境中运行,需单独为 cron 初始化环境变量

八、端口映射

将远端服务器的端口映射到本地电脑上:

ssh -L[LOCAL_PORT]:localhost:[REMOTE_PORT] [USER]@[SERVER_IP]

Note: 举例,命令 ssh -L9999:localhost:8888 [email protected]

的含义是把远端服务器 132.43.75.194 上的用户 musk8888 端口,映射到本地 9999 端口。

九、文件系统

安装一个叫 tree 的命令行工具,它能打印目录结构

yum install tree

限制打印目录深度为 1 层:

tree -L 1
.
├── bin -> usr/bin: 包含了很多基础 shell 命令的可执行文件,如 cp, mkdir
├── boot: 系统内核和启动镜像
├── dev: 包含关于设备的特殊文件,如 random, null
├── etc: 包含系统配置文件
├── home: 用户个人数据
├── lib -> usr/lib: 系统软件库,一般被 /bin 和 /sbin 路径下的可执行文件调用
├── lost+found: 文件系统发生错误后找回数据用的
├── media: 移动磁盘插入时,会在此目录下生成磁盘路径
├── mnt: 与 /media 类似,但不会自动挂载磁盘,而由系统管理员手动挂载
├── opt: 存储系统和外部软件代码,对应的可执行文件一般在 /bin
├── proc: 当前运行程序与内核信息,如 cpuinfo, meminfo, [PID]
├── root: root的根目录
├── run: 存放运行时信息,与 /var/run 关系密切
├── sbin -> usr/sbin: 与 /bin 类似,但只允许 root 访问
├── srv: 存放由服务器的服务产生的数据
├── sys: 虚拟的文件夹,存在于内存中,随系统启动创建,包含 内核、内存、驱动 等信息
├── tmp: 用于存放临时文件,系统重启时清空
├── usr: 软件安装路径
└── var: 运行时信息,如登录信息 (/var/log/wtmp)。系统不会自动清理此目录

十、推荐的书