# 新手建议

## 学习Linux的注意事项

* Linux严格区分大小写（命令全都是小写）—— 命令、文件名、选项等均区分大小写

* Linux中**所有内容**以文件形式保存，包括硬件

  * 硬盘文件是/dev/sd[a-p]
  * 光盘文件是/dev/sr0等

* Windows通过扩展名区分文件类型，还有图标可以区分；Linux不靠扩展名区分文件类型，靠文件权限区分，但也有一些约定俗成的扩展名：

  * 压缩包："*.gz", "*.bz2", "*.tar.bz2", "*.tgz"等
  * 二进制软件包：".rpm"
  * 网页文件："*.sh"
  * 配置文件："*.conf"

  注意：这些扩展名不是必要的，即时不加扩展名也没有影响，只是便于管理而已

* Linux所有存储设备都必须挂在之后用户才能使用，包括硬盘、U盘、光盘（将设备与挂载点连接的过程就是挂载）

* Windows下的程序不能直接在Linux中安装和运行

## 服务器管理和维护建议

### 服务器管理

|    目录名    |                           目录作用                           |
| :----------: | :----------------------------------------------------------: |
|    /bin/     | 存放系统命令的目录，普通用户和超级用户都可以执行，不过放在/bin下的命令在单用户模式下也可以执行 |
|    /sbin/    | 保存和系统环境设置相关的命令，只有超级用户可以使用这些命令进行系统环境设置，但是有些命令可以允许普通用户查看 |
|  /usr/bin/   | 存放系统命令的目录，普通用户和超级用户都可以执行，这些命令和系统启动无关，在单用户模式下不能执行 |
|  /usr/sbin/  | 存放根文件系统不必要的系统管理命令，例如多数服务程序。只有超级用户可以使用 |
|    /boot/    | 系统启动目录，保存系统启动相关的文件，如内核文件和启动引导程序（grub）文件等 |
|    /dev/     | 设备文件保存位置，我们已经说过Linux中所有内容以文件形式保存，包括硬件，这个目录就是用来 保存所有硬件设备的 |
|    /etc/     | 配置文件保存位置，系统内所有采用默认安装方式（npm安装）的服务的配置文件全部保存在这个目录中，如用户账户和密码，服务的启动脚本，常用服务的配置文件等 |
|    /home/    | 每个用户的默认登陆位置，普通用户的home目录就是在/home下建立一个和用户名相同的目录 |
|    /lib/     |                   系统调用的函数库保存位置                   |
| /lost+found/ | 当系统意外崩溃或机器意外关机时，产生的一些文件碎片放在这里，当系统启动的过程中fsck工具会对其进行检查，并修复已经损坏的文件系统。这个目录只在每个分区中出现，例如/lost+found就是根分区的备份恢复目录，/boot/lost+found就是/boot分区的备份恢复目录 |
|   /media/    |    挂载目录，系统建议是用来挂载媒体设备的，例如软盘和光盘    |
|    /mnt/     | 挂载目录，建议挂载额外设备，如U盘，移动硬盘和其他操作系统的分区 |
|    /misc/    |         挂载目录，系统建议用来挂载NFS服务的共享目录          |
|    /opt/     |  第三方安装的软件保存位置，但现在更多的是保存在/usr/local中  |
|    /proc/    | 虚拟文件系统，该目录的数据不保存到硬盘中，而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态灯，如/proc/cpuinfo是保存CPU信息的，/proc/devices是保存设备驱动的列表的，/proc/filesystems是保存 文件系统列表的，/proc/net/是保存网络协议信息的 |
|    /sys/     |              虚拟文件系统，主要保存内核相关信息              |
|    /root/    |                       超级用户的家目录                       |
|    /srv/     | 服务数据目录， 一些系统服务启动后可以在这个目录保存需要的数据 |
|    /tmp/     | 临时目录，系统存放临时文件的目录，该目录下所有用户都可以访问和写入，我们建议此目录不能保存重要数据，最好每次开机都把该目录清空 |
|    /usr/     | 系统软件资源目录，注意usr不是user的缩写，而是"Unix Software Resource"的缩写，所以不是存放用户数据，而是存放系统软件资源的目录。系统中安装的软件大多数都在这里 |
|    /var/     | 动态数据保存位置，主要保存缓存、日志以及软件运行所产生的文件 |

### 服务器注意事项

1. 远程服务器不允许关机，只能重启
2. 重启时应该关闭服务
3. 不要在服务器的访问高峰运行高负载命令
4. 远程配置防火墙时不要把自己踢出服务器（可以设置每五分钟将防火墙规则重置一次，配置完之后再取消该设置）
5. 指定合理的密码规范并定期更新
6. 合理分配权限
7. 定期备份重要数据和日志

磁盘分区是用分区编辑器在磁盘上划分几个逻辑部分，碟片一旦划分成数个分区，不同类的目录和文件 可以存储进不同的分区。

# 系统分区

## 分区类型

* 主分区：最多只能有4个
* 扩展分区：
  * 最多只能有1个
  * 主分区加扩展分区最多有4个
  * 不能写入数据，只能包含逻辑分区（这种限制是硬盘的限制）
* 逻辑分区

## 格式化

硬盘经过正确分区后仍不能写入数据，我们的硬盘还必须经过格式化之后才能写入数据。格式化又称逻辑格式化，它是根据用户选定的文件系统（如FAT16、FAT32、NTFS、EXT 2、EXT3、EXT4等），在磁盘的特定区域写入特定数据，在分区中划分出一片用于存放文件分配表、目录表等用于文件管理的磁盘空间。格式化就是按照文件系统的规则将硬盘分成等大小的数据块，我们把数据块称为block。

> 注：Windows可以识别的系统有FAT16、FAT32、NTFS；Linux可以识别的系统有EXT2、EXT3、EXT4

## 设备文件名

#### 硬盘设备文件名

Windows是直接分区——>格式化——>分配盘符即可使用，Linux需要分区——>格式化——>给分区建立设备文件名——>分配盘符才能使用。

| 硬件              | 设备文件名          |
| ----------------- | ------------------- |
| IDE硬盘           | /dev/hd[a-d]        |
| SCSI/SATA/USB硬盘 | /dev/sd[a-p]        |
| 光驱              | /dev/cdrom或dev/sr0 |
| 软盘              | /dev/fd[0-1]        |
| 打印机（25针）    | /dev/lp[0-2]        |
| 打印机（USB）     | /dev/usb/lp[0-15]   |
| 鼠标              | /dev/mouse          |

#### 分区设备文件名

分区设备文件名直接**在硬盘设备文件名后面加分区号**即可，如

* IDE硬盘接口第一个分区：/dev/hda1（如今几乎看不到）
* SCSI硬盘接口、SATA硬盘接口的第一个分区：/dev/sda1

> IDE硬盘是最古老的硬盘，理论最高传输速度是133M/s
>
> SCSI硬盘接口与IDE硬盘同时代，更加昂贵但速度更快，理论最高传输速度可达200M/s，但这种硬盘主要用在服务器上
>
> 但上两种硬盘接口如今已经基本淘汰，如今使用更多的是小口的SATA串口硬盘，SATA已发展到3代，其理论传输速度最高可达500M/s，目前不管是服务器还是个人机基本使用的都是SATA硬盘接口。

需要留意的是，逻辑分区永远都是从5开始的

## 挂载

挂载实际上就是Windows中分配盘符的过程，盘符则被相应地称为挂载点，必须分区的分区有以下两种：

1. 根分区：/
2. swap分区（交换分区）：可以理解为虚拟内存，当真正内存不够用时，可以使用这部分交换分区的硬盘空间来当内存，理论上来说交换分区应该是内存的两倍，但最大不超过2GB

若无这两个分区，Linux不能正常使用，但我们还推荐把/boot单独分区，这是为了防止Linux系统启动不起来，一般200MB即可。

# 远程登陆管理工具

## 网络连接

网络连接从虚拟机设置中可以看到，一共有三种：桥接、NAT和Host-only，下面讲解其区别：

* 桥接：桥接意味着虚拟机如同一个单独的主机一样访问Wifi等，也可以和其他机器通信
* NAT：虚拟机仅能和主机通信，但若主机可以访问互联网，虚拟机也可以访问互联网
* Host-only：虚拟机仅能和主机本机通信，不能访问互联网

## 网络配置

1. 首先调成Host-only模式，使得虚拟机仅与主机连接
2. 在主机上找到VMware Network Adapter VMnet1的IP地址，我本地地址为192.168.19.1
3. 在虚拟机上使用`ishw -c netwowrk`命令找到logical name，此即为虚拟机的网卡名称，我的虚拟网卡名称为ens33
4. 使用命令ifconfig  [不等于IP地址]  logical name，例如我使用的是`ifconfig ens33 192.168.19.2`
5. 此时再ifconfig即可看到我们设置的已生效
6. 我们可以在主机ping这个IP地址看到生效
7. 使用secureCRT连接即可

需要注意的是，以上方法配置IP地址时不是永久生效的，也就是重新启动电脑时就失效了，若想永久生效需要改变配置文件

若使用NAT模式，则步骤简单很多，只需要ifconfig获得IP地址之后直接用secureCRT连接即可

## WinSCP

另外推荐一个Windows主机与Linux虚拟机进行文件传输的工具——WinSCP，操作方法与上面类似，只需输入对应的IP地址即可连接。



## 安装linux系统（以ubuntu为例）

- 使用vmware虚拟机安装

  [参考此博客：VMware安装Ubuntu18.04](https://zhuanlan.zhihu.com/p/38797088)

- 使用win10子系统安装

  [参考此博客：在 win10 下使用 ubuntu 子系统](https://zhuanlan.zhihu.com/p/76032647)

# Linux常用命令

## 一、最常用命令

这是我们**使用得最多**的命令了，**Linux最基础的命令**！

- 可用 `pwd`命令查看用户的当前目录
- 可用 `cd` 命令来切换目录
- `.`表示当前目录
- `..` 表示当前目录的上一级目录（父目录）
- `-`表示用 cd 命令切换目录**前**所在的目录
- `~` 表示**用户主目录**的绝对路径名

**绝对路径：**

- 以斜线（/）开头 ，描述到文件位置的**完整说明** ，任何时候你想指定文件名的时候都可以使用

**相对路径 ：**

- 不以斜线（/）开头 ，指定**相对于你的当前工作目录而言的位置** ，可以被用作指定文件名的简捷方式

## 二、文件处理命令

### 1. 命令格式与目录处理命令`ls`

**命令格式**：`命令[-选项][-参数]`，例：`ls -la /etc`

**说明**：

1. 个别命令使用不遵循此格式
2. 当有多个选项时，可以写在一起
3. 简化选项与完整选项：`-a` 等于 `--all`

`ls`命令的语法：

1. `ls -a`可以显示所有文件，包括隐藏文件（以点.开头的文件是隐藏文件）

2. 若希望查询的不是当前目录，可以使用`ls+其他目录`进行查询

3. `ls -l`可以显示更多属性（long），属性阐述如下：
1. 第一列分为三个部分，第一部分（如d告诉我们文件的类型是一个目录，-为二进制文件，1为软链接文件），drwx表示该文件支持读写和执行操作，r,w,x分别对应读、写、执行三个权限，三列分别对应所有者，所属组，其他人的权限
   
2. 第二列的2、2、3等表示调用次数
   3. 第三列表示所有者，也就是这个文件的总负责人（拥有文件的所有权，可转让）
4. 第四列表示所属组，也就是可以操作这个文件的人
   5. 第五列表示文件大小，默认单位是字节（很反Windows）
6. 最后一个是文件的最后一次修改时间（Linux没有创建时间这个概念）
   
4. `ls -lh`比原先的更人性化（humanitarian），它将对应的单位也显示了出来，`-h`实际上是一个通用选项，很多命令都可以加

5. `-d`显示当前目录本身而不显示目录下的数据，一般与`-l`结合使用，如`ls -ld /etc`

6. `ls -id`可以查看当前目录对应的文件ID

### 2. 目录处理命令

##### `mkdir`

**语法**：`mkdir -p [目录名]`

**功能描述**：创建新目录，`-p`递归创建（若一个目录本身不存在，可以在创建这个目录的同时创建子目录），也可以同时创建多个目录

##### `cd`

**语法**：`cd directory`

**功能描述**：改变当前目录

##### `pwd`

**语法**：`pwd`

**功能描述**：显示当前目录（print working directory）

##### `rmdir`

**语法**：`rmdir [目录名]`

**功能描述**：删除空目录（若目录非空则不能删除）

##### `cp`

**语法**：`cp -rf [源文件或目录] [目标目录] -r 复制目录 -p 保留文件属性（文件创建时间等不发生变化）`

**功能描述**：复制文件或目录

##### `mv`

**语法**：`mv [源文件或目录] [目标目录]`

**功能描述**：剪切文件、改名

##### `rm`

**语法**：`rm -rf [文件或目录] -r 删除目录 -f 强制执行`

**功能描述**：删除文件

### 3. 文件处理命令

##### `touch`

**语法**：`touch [文件名]`

**功能描述**：创建空文件

##### `cat`

**语法**：`cat [文件名]`

**功能描述**：显示文件内容  `-n`可显示行号

##### `tac`

与`cat`相反，可以倒着显示

##### `more`

`cat`命令显示的往往过多，若希望分页显示可以使用`more`，用法与`cat`相同，使用时按空格可以一页页往后翻，使用q或Q退出

##### `less`

由于`more`无法向上翻，我们可以使用`less`命令，可以使用page up一页页往上翻，也可以使用上箭头一行行往上翻，其他操作与`more`相同。另外`less`还可以进行搜索，比如想要搜索关键词service，可以输入/service进行检索，页面会对这些关键词进行高亮，可以使用`n`找到其他关键词位置

##### `head`

若只想要看文件的前几行，可以使用`head -n`加指定行数，若不加则默认显示前10行

##### `tail`

与`head`类似 ，但是显示后面几行。

常用搭配为：`tail -f`，该命令会动态显示文件末尾内容

## 三、链接命令`ln`

**语法**：`ln -s [原文件] [目标文件] -s 创建软链接`

**功能描述**：生成链接文件

**示例**：

* `ln -s /etc/issue issue.soft`：生成软链接
* `ln /etc/issue issue.hard`：生成硬链接

**软链接和硬链接的区别**

我们使用`ls -l`查看这两个文件的信息：

```
-rw-r--r-- 2 root root 26 Jul 15  2020 issue.hard
lrwxrwxrwx 1 root root 10 Jan 31 04:55 issue.soft -> /etc/issue
```

我们会发现这两个文件的信息相差的非常多，软链接文件开头的文件类型是`l(link)`，三个权限都是`rwx`，即可读可写可执行，软链接文件就类似于Windows的快捷方式，用处是便于做管理，我们可以看到最后有一个箭头指向`/etc/issue`。另外我们看到这个文件只有31个字节，因为它只是一个符号链接。我们可以总结得出软链接的三个特点：

1. 权限是`rwx`
2. 文件很小，只是符号链接
3. 箭头指向源文件

下面我们看硬链接的特点，我们首先分别查看 这两个文件的信息：

```
ls -l issue.hard
ls -l /etc/issue
```

我们可以看到这两个文件的所有信息一模一样，包括文件的大小，这类似于拷贝，似乎相当于`cp -p`，而硬链接和`cp -p`的最大不同就是硬链接可以实现同步更新，我们可以做一个简单的实验，我们先查看硬链接文件，然后往源文件中写入文件，可以发现硬链接文件也被同时修改了，当然软链接也会同步修改。

但当我们将源文件复制到另一个位置并删除原位置文件之后，再试图打开软链接会提示“没有那个文件或目录”，而且再显示这个目录软链接会标红并一直闪，而硬链接可以正常访问，没有影响，这就是硬链接和软连接的不同之处。

实际上我们可以通过命令`ls -i`来识别其`i`节点以辨别出是硬链接还是软链接，硬链接和源文件的`i`节点相同，软链接则不同。

硬链接相当于一个同步文件，但可以做实时备份（一个文件删了不会影响另一个文件），硬链接有两个限制，这也是硬链接和软链接的区别：

1. 不能跨分区
2. 不能针对目录使用

## 四、权限管理命令

Linux用户一共分成三类，分别是所有者（U），所属组（G）和其他人（O），权限也分成三类，分别是`r`，`w`，`x`，对应读、写、执行，我们首先学习如何更改权限。

#### `chmod`

更改文件的人只能是文件所有者或者管理员root用户，更改文件权限有两种方式，第一种方式如下：

```
chmod [{ugoa}{+-=}{rwx}][文件或目录]
```

其中第一个花括号里`u`，`g`，`o`，`a`分别表示所有者，所属组，其他人和所有人，第二个花括号`+`和`-`分别表示增加和减少权限，`=`表示成为后面的权限。第二种方式如下：

```
chmod [mod=421][文件或目录] -R 递归修改
```

数字的意思只是将三个权限位分别用数字来表示，比如`r`用4表示，`w`用2表示，`x`用1表示，则若要表示`rwxrw-r--`则记为`764`

#### `chown`

命令英文原意是`change file ownership`，作用是改变文件或目录的所有者，改变文件file的所有者为user的具体用法为：

```
chown user file
```

要注意只有root和文件的所有者可以改变文件的权限

#### `chgrp`

命令英文原意是`change file  group ownership`，作用是改变文件或目录的所属组，若具体用法和前面`chown`相同。我们可以使用`groupadd`命令添加组（使用`useradd`命令添加用户）

#### `umask`

命令英文原意是`the user file-creation mask`，作用是显示、设置文件的缺省权限，语法是：

```shell
umask [-S]
```

其中`-S`的作用是显示新建文件的缺省权限，但需要注意的是缺省创建文件时不可以有可执行权限的，所以当`touch`创建文件时会发现所有权限都少了`x`。

当我们直接使用`umask`时，比如显示0022，第一个0是特殊权限，我们暂时不涉及，第二只第四位分别是所有者、所属组和其他人，我们的最终权限实际上是`777-022=755`，也就是`rwx r-x r-x`，当然这指的是目录，如果是文件由于没有可执行权限，文件权限应当是`rw- r-- r--`，当然缺省创建的权限可以更改，直接使用`umask 077`即可将文件缺省权限更改为`rwx --- ---`，但不推荐做这种更改
