Linux 学习笔记(基础)


写在前面

本文档参考书籍有:

  • Linux命令行大全(William E. Shotts著郭光伟等译The Linux Command Line 中文版 · 看云)

  • Red Had Linux9实务自学手册(李洋编著)前7章

  • Linux就该这么学(刘遄著)最后一本是开源的,可以到他的网站看看

这份文档里不在意对命令的详细选项说明,但《Linux就该这么学》一书的作者有一个网站,可以在里面查看各种命令的详细用法 具体链接

写的过程中可能会掺杂一些博主的博客,相应位置会贴出链接

所有的命令都在(文本)终端中执行

一. 概述

1. 发展历程

从一个叫 Linus Torvalds 开始,由众多支持开源的技术人员参与开发维护的一个系统

知道上面这些就行了

2. Linux的组成

linux = 内核 + shell + 文件结构 + 实用工具 (主要组成部分)

  • 内核:常位于/usr/src/linux,是整个系统的底层,负责硬件的驱动,以及提供各种软件/系统所需的核心功能。

  • Shell:翻译为 ‘壳’ ,因为平时怎么可能让我们去触碰底层的驱动,而且手动操作底层实在是太憨了。shell 是一个命令解释器,解释我们的命令给内核去执行。

  • 文件结构:文件结构是文件存放在磁盘上的组织方法。主要体现在对文件和目录的组织上,这也是Linux中一切皆文件宗旨的一个重要部分。

  • 实用工具:上面三个就可以组成一个最最基础的系统。此外的实用工具可以为用户提供更多的便利,毕竟抽象层级越高越方便。

3. Linux发行版

因为是开源的,只要遵循 GPL协议,就可以自由修改内核,并在外面套上各种各样的软件,封装成一个系统发布给别人使用。所以就可以看到现在各种各样的Linux发行版,Mint、Ubuntu、Debian、Mageia、Fedora、Opensuse、ArchLinux、CentOS...

各发行版的大致分类。一般是按照打包方式划分或者发行方式划分,发行方式划分分为商业版和社区版,这里按照打包方式划分进行介绍

以下发行版信息来源于Linux系统发行版大全(历史大全含发展图)_tanglx(汤龙祥)的博客-CSDN博客_linux 版本大全,这里列个(非常)简单的表,有兴趣可以看看

打包方式 发行版 简单介绍(没有介绍)
Deb Debian
Deepin 还有基于Deepin的UOS
Ubuntu
... Linux Mint、Elementary OS、Xubuntu ...(套娃,基于Ubuntu)
Rpm Red Hat
CentOS
Fedora
Red Flag
openSUSE
... aLinux、Asianux Server、Qomo Linux、Red Hat Enterprise Linux、SUSE/openSUSE
其它 Gentoo 使用自己的包管理系统,口号是自由,即自由组装自己的系统,专业性++,因为是年轻的系统,号称集合了所有Linux的优点。基于源代码,安装的时候需要自己编译安装自己的系统,过程可能对新手稍显困难
Arch 和Gentoo大体相同,更新方式和Gentoo一样采用的滚动更新,但安装比Gentoo更方便,但在Linux里,Gentoo好像更为高大上个人看法
FreeBSD 其他分类的系统基本都是基于FreeBSD的系统。Calculate、Foresight、Lunar
基于slackware ...没用过,略

4. Linux 安装

没有什么比自己动手来安装一个系统更开心且有成就感的事了

  • 选一个喜欢且适合自己的Linux系统

  • 在网上找教程

  • 安装它

因为我安装的是 ArchLinux,所以这里把我看的教程的链接放到这里 ->Arch Linux 安装使用教程 - ArchTutorial - Arch Linux Studio因为博主使用的网站部署在github上,所以使用国内的网络可能会比较慢,**上网或耐心等待

推荐安装 Arch、openSUSE、Debian、Deepin、Majaro、Mint

不推荐安装 RedHat、CentOS、Federo、Gentoo

RedHat系列的系统不太适合作为桌面系统使用,个人对Ubuntu观感不佳,但国内用户数量很多,或许可以试试。不推荐Gentoo,因为可能安装几天都安装不了(菜狗是我),首推 Arch,Arch Wiki 真的太好了,这里的人说话又好听,个个都是人才,无论是官方文档还是社区交流一般都能找到想找的,且系统稳定性提高了不少,不像几年前那样时常宕机,起码我安装以来从没有宕机。

  • 注意1:如果要在电脑上安装实体机,找个 硬盘 或者 云 保存好数据

  • 注意2:如果是实体机,建议不要只给根分区划分100G,因为如果将系统作为一个桌面系统,无论是一般用户还是root用户,使用包管理器安装的软件一般都默认安装在根分区 /usr,想想Windows所有软件都安装在C盘下的恐怖

# 我的分区方案
gpt
/efi   1G    vfat (200M就够了,只是喜欢整数)
/      465G  ext4
/home  589G  ext4
  • 注意3:如果想安装Win+Linux双系统,建议先安装Win。在先安装Linux的情况下再安装Windows会再创建一个新的引导,且这个引导比Linux的优先级高,开机会默认进入Win系统

5. 查看系统基本信息

# 查看:系统类型 + 主机名 + 系统版本 + 时间 + CPU架构 + 系统协议(应该是吧)
uname -a
### 显示信息
Linux DragonBoat 5.16.16-arch1-1  Mon, 21 Mar 2022 22:59:40 +0000 x86_64 GNU/Linux

# 更改主机名,ctl 后缀的命令为 RedHat 7 版本以上系统所有
hostnamectl set-hostname newName

# 查看计算机状态信息
hostnamectl status

# 查看网络状态。  
# 这里address少打几个字母问题不大,所有网络配置命令只要已打出的命令具有唯一性
# 即在ip命令中`ip add`只有一条对应的`address`,其会自动补充并执行
ip address 

二. 包管理

介绍包管理当然先介绍包管理器

上面给Linux各种发行版分类的时候采用打包方式分类和这里的大体上类似

类别 打包工具 简介
Debian dpkg Debian家族基础包管理工具
apt 高级打包工具,是dpkg包管理的前端工具,众所周知,抽象层级越高越方便
aptitude 另一个非常常用的打包工具,工作方式类似apt,最初为Debian设计,但现在似乎在RedHat系列上也能看到它
synaptic 基于GTK+的APT的可视化包管理器,如果不想使用命令行的话可以试试这个
Rpm rpm 红帽创建的基本标准打包格式和基础包管理系统。基于这个底层系统,有多个前端包管理工具可以使用
yum 一个开源、流行的包管理器,和Apt具有大体相同的功能
dnf 基于Rpm的包管理器,可以说是下一代的yum,在新版的Fedora中dnf已经作为默认的包管理器
其它 Pacman ArchLinux的包管理器,用于 Arch Linux 和其他的一些小众发行版。简单易用
Zypper 使用 libzypp 库制作的用于 OpenSUSE 系统上的命令行包管理器
Portage Gentoo 的包管理器,被称为Linux下最好的包管理器
yay 基于Pacman的包管理器,可以作任何Pacman的操作并额外添加了其它用法

包管理这部分就不写了

不同的系统有其对应的包管理器,可以到系统的官网查看包管理器的说明书就好

关于我使用的Pacman,ArchWiki上详细无比,自认自己做不到写得更好,做个粘贴怪,这是链接

一些注意事项:

  1. 通过包管理器安装的软件包是默认安装在根目录下的,不要轻易去改动安装位置,我曾经试过去改动位置,导致部分软件无法运行

  2. 很多教程里都只是给根分区划分了100G左右的大小,个人觉得是有问题的,我之前只有一个500G硬盘的时候根分区大小为100G,虽然最后没自爆,但最后使用率到达了89%

三. 用户桌面

这部分应该放在第二章安装那里的,但桌面也只是一个软件而已,卸载之后换一个就行了,Linux就是这么方便快捷

这部分写不写关系不大,但既然实务自学手册上有这一章,那就加上

这两个发展到现在基本上都差不多,一般在安装系统时,如果是完全安装,都默认安装一个桌面

桌面能看就行,不必花太多时间在桌面上,如果真的想可以找一些Linux桌面美化教程

桌面 简介
KDE 看我链接
Gnome 看我链接

四. 硬件管理

1. CPU

/proc 是系统内核的镜像,以文件系统的方式访问系统内核数据提供的接口,其中文件cpuinfo 存放着CPU信息,使用 cat 查看文件

# 查看电脑硬件——CPU,
cat /proc/cpuinfo
# 筛选去除一些无用信息
cat /proc/cpuinfo | grep 'model name' |uniq

# 查看电脑硬件——GPU
lspci 
lspci | grep -i nvidia  # 英伟达显卡
nvidia-smi              # 英伟达显卡

2. 硬盘

即使是到了现在,SmartMontools依旧是一款比较流行的硬盘检测工具

# Arch 上安装 SmartMontools
yay -q smartmontools
# 其它,前往官网下载相应的软件包
# https://sourceforge.net/projects/smartmontools/files/smartmontools/7.3/smartmontools-7.3.tar.gz/download
# 下载后进行解压和安装,注意不要直接复制下面的命令,可能版本不同
wget https://sourceforge.net/projects/smartmontools/files/smartmontools/7.3/smartmontools-7.3.tar.gz/download
tar zxvf smartmontools-7.3.tar.gz 
cd smartmontools-7.3
./configure
make
sudo make install

# 开始进行检测.`-i`测试主办和硬盘是否支持 smart 技术,能打印出一堆东西就成功了
sudo smartctl -i /dev/sda 
sudo smartctl -i /dev/sda1
# 选项`-A`显示的是检测道德硬盘数据部分
sudo smartctl -A /dev/sda1

查看硬盘的数据、类型等信息

# 查看电脑硬件——硬盘
lsblk
df -a              # 查看使用率
df  /dev/sda1   # 查看单一分区的使用率
sudo fdisk -l     # 同查看,信息更详细

# 查看某个文件使用的数据块
du        # disk usage,逐级进入指定目录

3. 内存

# 监控 真实内存 使用情况
free
# 监控 虚拟 内存使用情况(Virtual Meomory Statistics)
vmstar
# 如果还想检测得更仔细,可以用第三方工具,书上推荐:memtest86

4. 管理磁盘

硬盘命名方式

/dev/sda: sd 指 SCSI 硬盘,用a,b,c,d,e等代表第几块

/dev/hda: hd 指 IDE 硬盘,...

/dev/sda1: 最后的数字是指在这块硬盘上的第几个分区

配置硬盘

# /etc/fstab 用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统
cat /etc/fstab    # 查看我的fstab文件
### 部分显示信息
# /dev/sda1
UUID=d3ea83a0-a67a-44ed-9020-3ad52fce3544       /home           ext4            rw,relatime     0 2

其基本书写规则为:
                    
# 更详细的介绍请查看:
# https://wiki.archlinux.org/title/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
# 为设备持久化命名,最好使用 UUID,这是每个硬盘分区的唯一名字
lsblk -f           # 查看磁盘设备的 UUID
blkid /dev/sda1    # 查看磁盘设备的 UUID

为系统永久添加一个硬盘

# 检查系统已添加但未挂载的硬盘
sudo fdisk -l     # 假设 /dev/sdb 未挂载
# 转化硬盘类型
parted /dev/sdb
(parted)mktable             #输入mktable
New disk label type? gpt    #输入gpt 将磁盘类型转换为gpt 如磁盘有数据会警告,输入yes即可
quit     
# 划分分区并选定文件系统
sudo cfdisk /dev/sdb
# cfdisk 是一个好用的半图形化的程序,这里假设将整个硬盘划分为一个分区 /dev/sdb1
# 根据需求划分分区,type 一般为 Linux file system
# 格式化硬盘,一般可选 ext4,如果有需求可以选其他
mkfs.etx4 /dev/sdb1
# 建个目录,作为挂载点
mkdir /home/guyan/movic
mount /dev/sdb1 /home/guyan/movic
# 查看硬盘的UUID
blkid /dev/sdb1
# 修改 /etc/fstab,参考上面的 配置硬盘
sudo vim /etc/fstab
### 例如,添加
# /dev/sdb1
UUID=cb279989-9ef6-4cb9-ab31-656c18f40849    /home/guyan/movic       ext4            rw,relatime     0 2

5. 优化系统硬盘

  • 删除无用文件

  • 整理磁盘碎片。最好的方法是做一个完整的备份之后,重新格式化分区

  • 调整硬盘参数。在RedHat上可以试试hdparm,但无论是服务器还是本机,我的建议都是:不要尝试

五. 命令

1. 终端

在没有安装桌面,只安装了基础系统的时候,开启电脑会登陆小黑屋,没有图形系统,这个状态是我们看到的绝大部分服务器的状态,服务器管理员在管理服务器的时候都是通过小黑屋来管理

当电脑安装了桌面环境之后,一般会安装一个伪终端来作为日常的使用,伪终端是一个软件,可以通过它让系统执行指令,还不会占用整个页面。

如果在有桌面环境的时候想使用真正的终端,可以同时按下"Ctrl + Alt + F3",F1,F2 被分配给桌面系统,F3 到 F12 都分别可以切换使用,这些终端编号为 tty[n]

关于命令,命令的一般的格式是:command [options parameters] objects

2. 管道符

管道符:' | '

应用于命令中,就是一个管子,将上一个命令得到的结构传递给下一个命令进行处理

比如如果想在 一个文件夹中查找一个文件,想看看这个文件是否存在,直接使用 ls 命令进行查看会跳出来一堆东西(甚至可能一百多行的数据),所以这个时候需要将 ls 得到的结果通过管道符传递给命令 grep(一个筛选并打印匹配结果的命令),让 grep 去筛选出对应的结果并打印出来

# 切换工作目录,用 bin 来演示
cd /usr/bin
# 查询 firefox 
ls | grep firefox
# grep 支持正则表达式

3. 重定向

符号:'>'

也叫 I/O 重定向,通过这个符号,可以重定向输入输出,命令的输入来自文件,而输出也来自于文件

ls -l /usr/bin  >  ls_output.txt
# 此时命令行中没有任何输出,这些输出被重定向到了 ls_output.txt 这个文件中
# 注意,此时文件将被覆盖,其中的内容都不会保存

符号:'>>'

也是重定向,区别于上一个,这个重定向会将重定向的内容添加到原文件的末尾而不是覆写,且如果接收输出的文件没有创建时也会被创建

# 尝试执行两次以下的命令,将得到两倍的快乐
ls -l /usr/bin  >>  ls_output.txt

4. 连续的命令

符号:';' '&&' '||'

当有两个命令需要执行,但中间不想等系统逐一执行,可以将多个命令结合起来,相当于一条很 长 的命令

所以Linux定义一系列符号,连接多条命令

# ; 不管前面的命令有没有错,下一条命令都会继续执行
# /lllll 为一个不存在的目录
cd /lllll ;  ls    # ls 命令还会被执行

# && 顺序执行,当一条命令出错时,不再执行后面的命令
cd /lllll && ls    # ls 命令还不会被执行

# || 或,顺序执行命令,如果有一条执行成功,则停止
cd /lllll || ls    # cd 错误,ls 被执行
ls || cd /lllll    # ls 被执行,命令停止,没有执行 cd 命令,没有报错

上述符号可以尝试组合使用

六. 文件系统管理

1. 最常用的命令

改变工作目录(cd)、显示路径(pwd)、显示目录内容(ls)

cdls一定是在使用系统的过程中使用最频繁的命令,一定是

# 一般我们称当前在文件系统中的位置为工作目录
# 使用下面的命令可以查看当前的工作目录
pwd
# 切换工作目录
cd /usr  # 相对路径和绝对路径想必都了解了,略
cd ..    # 返回上一级目录,也可以返回上两级 cd ../..
# 显示指定目录下的文件
ls 
ls -l    # 以详细信息的形式显示
ls -a    # 显示隐藏文件

1.1 ls -l

当使用上述命令时,会显示出文件/目录的详细信息

ls -l
### 显示信息
lrwxrwxrwx   1 root root          7 Dec  7 10:41 lib -> usr/lib
位置 简介
第一个字符 表示文件类型;'-'表示普通目录;'d'为目录;'l'为符号链接;'b'为块设备文件;'c'为字符设备文件
第2~4个字符 权限,分别为读(r)、写(w)、执行(x),这个位置表示的是文件所有者对文件的权限
第5~7个字符 表示同组用户的权限
第8~10个字符 表示其他用户的权限

权限除了'r' 'w' 'x' 外,还有:

's':当文件被执行时,把该文件的UID或GID赋予执行进程的UID或GID

't':设置标志位,即留在内存,不被换出。如果文件为目录,则目录中的文件只能被文件所有者或root用户删除。如果是可执行文件,则在执行后,指向其征文段的指针仍留在内存,方便再次执行。

'-':没有设置权限

后续 文件/目录权限管理 会有相应的修改方法

2. 文件系统结构

文件系统是一颗倒着的树,从/开始。或许可以使用 tree 命令来看一下这颗树

# 如果出现 command not found 就是 tree 这个软件包还没有被安装
# ArchLinux 安装 tree
sudo pacman -S tree
# 常规Linux安装tree
sudo apt-get install tree
# 或
yum -y install tree

# tree 的常规使用, 只显示两个层级,太多眼花
tree / -L 2

# 看看在根下有什么
tree / -L 1
### 显示信息
/
├── bin -> usr/bin
├── boot
├── dev
├── efi
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib
├── lost+found
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/bin
├── srv
├── swapfile
├── sys
├── tmp
├── usr
└── var

注意,Linux系统的文件系统大同小异,以上的列表是根据我的系统得到的

目录 作用
/ 根目录,所有目录的起点
/bin -> usr/bin 包含系统启动和运行所必须的二进制程序。一般内部命令的二进制程序都会存放在这里。
/usr/bin 用户安装的第三方程序的二进制程序,一般会自动创建一个软链接到 /bin
/boot 存放Linux启动时的一些核心文件,包括Linux内核、连接文件以及镜像文件
/dev Linux中一切都是文件,硬件设备也是,它们会以文件的形式在这个目录下
/efi 里面有个默认引导程序,一般这个文件在/boot下,但在我的Arch上直接出现在根目录下,不过问题不大
/etc etc,Etcetera的缩写,用来存放所有的系统层面的的配置文件。包含一系列的shell脚本,系统启动时会启动相应的系统服务。在/etc/crontab, 定义自动运行的任务。 /etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表
/home 自动为每个用户创建一个目录,避免用户之间相互干扰
/lib 包含核心系统程序所需的库文件。这些文件与 Windows 中的动态链接库相似,作用类似于 Windows 里的 DLL 文件;几乎所有的应用程序都需要用到这些共享库;类似的还有lib32 lib64 libx32
/lost+found 当部分恢复一个损坏的文件系统时,会用到这个目录。除非文件系统 真正的损坏了,那么这个目录会是个空目录
/mnt mount;设备的可移除挂载点
/proc Processes; 一个虚拟的文件系统,存储当前内核运行状态的一系列文件,存储在内存里,这些文件是可读的,可以从这里窥视内核是怎么监管系统的
/root 系统管理员的家目录
/run 临时文件系统,储存系统启动以来的信息,当系统重启时,这个目录下的文件应该被删除或清除;Arch挂载硬盘时,会挂载在/run/media 下而不是 /mnt
/sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留
/srv 系统启动时,存放服务启动之后需要提取的数据
/swap 虚拟交换分区,真实内存不足时使用硬盘空间作为内存,部分系统或许会将它命名为 /swapfiles
/tmp temporary;用于存储由各种程序创建的临时文件的地方。一些配置,导致系统每次 重新启动时,都会清空这个目录
/usr /usr 目录可能是最大的一个目录。它包含普通用户所需要的所有程序和文件
/usr/bin 包含系统安装的可执行程序。通常,这个目录会包含许多程序
/usr/lib 包含由/usr/bin 目录中的程序所用的共享库,通常为二进制文件
/usr/local 由源码编译的程序会安装在/usr/local/bin 目录下
/usr/sbin 包含许多系统管理程序。
/usr/share 包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图标,桌面背景,音频文件等等
/usr/share/doc 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档
/var 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都在这里

3. 管理文件与目录

3.1查看文件内容

截取全部:cat、more、less

截取部分:head、tail

这些命令可以打开文件,查看相应的文件内容,甚至是当使用这些命令查看目录时,也会产生一些效果

当截拳全部内容时,三个命令的格式大体相同,但一般建议使用less,因为less可以前后翻页

cat fileName
more fileName
less fileName

截取部分的命令有head和tail

headtail使用-n选项来控制所要截取的行数

head -n 5 fileName

# 截取文件后 n 行
tail -n 5 fileName

# -n,默认截取文件前十行或后十行

3.2 文件内容查询

命令:grep、fgrep、egrep

作用:以指定的查找模式搜索文件

  • grep 一次只能搜索一个,可扩展正则表达式,一般使用这个命令而不是其他两个

  • egrep 可扩展正则表达式

  • fgrep 检索固定字符串

grep 'String' fileName # 在fileName 中检索字符串'String'
# '-n',在输出时加上在文件中的行号,可以用于定位,但感觉没什么用
# '-i',不区分大小写
# '-x',严格匹配

# 一般会把'ls'、'cat'等命令与grep连用,这里用到管道符,后面应该会提起
ls / | grep home
cat /etc/passwd | grep root
# 或者用来在一个群体内查找也不错
grep stdio.h *.c # 在C程序文件中搜索包含'stdio.h头'文件的所有文件

3.3 文件查找

上面的是文件内容查找,但当找不到文件的时候,可以使用 find、locate 命令来查找文件

# find
find [path] [option value ... ]
# '-name',根据名字查找
# 其它选项:'-lname','-gid','-uid','-empty','-path','-perm'
# 逻辑选项:'-and','-or','not'
find / -name 'tmp' -user 'guyan'
find ! -name 'tmp'
find -name 'tm*'

3.4 文件处理

主要是 sort 和 uniq

sort 可以用来对文件中的各行进行排序,算是一个强大的数据管理工具,用于管理内容类似于数据库记录的文件,从一行中抽取一个或多个关键字进行排序

sort [选项] 文件名

uniq 的作用就是消除文档中的重复行,注意,这两个命令并没有改变原文件,只是读取文件后排序输出。

实际的日常使用中并没有用到

3.5 文件内容统计

wc [选项] 文件名

可以统计字节数(-c)、行数(-l) ,字数(-w)

一样感觉用处不大,起码我不会在命令行下编辑一些中文文档

3.6 文件比较

比较文件的异同,主要是 comm 和 diff 命令

comm 是对两个已经排好序的文件进行比较,也可以显示两个文件共有的行

diff 是逐行比对两个文件,并显示出两个文件中所有的不同的行

具体选项很多,但用处比较小,一般如果写类似于自动更新文档的脚本或许可以有机会用到

3.7 文件的复制、移动、删除

复制(cp)、移动(mv)、删除(rm)

# cp
cp -a 源文件或目录 目标文件或目录
# '-a' 可以在复制时保留链接、文件属性并递归复制目录,-a 最好是将它当成默认的使用方式
# '目标文件的目录' 可以是新的名字,如果名字不变,注意复制体不要放在同一路径下

# mv
mv -i 源文件或目录 目标文件或目录
# '-i',也是一个建议默认使用的选项,它会在目标文件或目录的名字在路径下有重复的时候
# 对你进行询问是否覆盖,可以避免误操作
# mv ,当路径不变的时候,可以用作修改文件或目录的名称
mv -i oldName newName

# rm
rm -rf 文件或目录    # heiheihei
# '-r',递归删除
# '-f',忽略提示,直接删除,避免要一直按‘enter’
# 建议将'-rf' 作为默认选项,但删除前请认真确认没有删错文件
rm -rf /tmp/testDocu/* # '*'作为通配符,删除/tmp/testDocu下所有文件
# 注意,不要使用下面这个命令
rm -rf /*    # heiheihei

3.8 文件链接

在上面 2. 文件系统结构 中,有下面内容,是一些箭头,从一个目录指向另一个目录

tree / -L 1
### 显示信息
/
├── bin -> usr/bin
├── lib -> usr/lib
├── lib64 -> usr/lib

ln命令用于创建文件链接,是给系统中已有的某个文件指定一个可用于访问它的名称。可以设置新的文件名指定不同的访问权限,以控制对信息的共享和安全性问题。

链接有硬链接和软链接,这里不想说明它们的区别,知道怎么用着好用就行。

  • 硬链接:链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接

  • 软链接:没有硬链接的那些限制,且软链接只是相当于Window下的快捷方式

# 不使用选项时,默认建立硬链接
ln fileName /home/guyan/Destop/fileHardLink
# 选项'-s',建立软链接,一般情况下我们都只使用软链接
ln -s fileName /home/guyan/Destop/fileSoftLink

3.9 目录的创建、删除

创建(mkdir)、删除(rmdir),删除也可以用 rm 来代替,并且因为 rmdir 要求在删除目录时目录为空且对父目录具有操作权限,rm 相较起来更加方便

# '-p',这个选项可以递归创建目录,建议作为默认选项
mkdir -p /home/guyan/Destop/1/2/3
# 此时要求目录必须为空
rmdir -p /home/guyan/Destop/1

4. 文件/目录权限管理

Linux系统中每一个文件都有一个所有者,同时具有一个足编号,表示该文件所属的组。

4.1 用户权限管理

5.1.1 中使用 ls -l 查看文件的权限,文件和目录的访问权限只有读、写、执行。chomod 命令能更改文件/目录的访问权限

chmod [who] [+|-|=] [mode] fileName
选项 选项 简介
[who] u [user]对文件所有者的权限进行设置
g [group]对文件所有者的同组用户的权限进行设置
o [other]对其他用户的权限进行设置
a [all]对所有用户的权限进行设置
[+\ -\ =]
-
=
[mode] r、w、x 读、写、执行
s、t、u、g、o
chmod a+x fileName
chmod ug+w,o-x fileName

一般情况下可以使用字符的形式更改用户权限,但也可以将权限字符转化为数字,为避免混淆,权限 r = 4 , w = 2, x = 1

chmod a+1 fileName
chmod ug+2,o-1 fileName
# 还可以直接三个数字连在一起同时为 u g a 设置权限
chmod 777 fileName # 当然,一般不建议 777

4.2 文件所有权

cp 命令会复制其权限设置,当一个用户复制一份文件给别人的时候,需要更改文件的所有者

chown [options] file
# '-R' 递归改变
# '-v' 显示 chown 命令对文件的详细操作

6. 编辑文件内容

在这部分要熟悉一个在Linux里很流行的程序,vivim

vim是vi的进阶版,但差别在哪也没查,一直在用 vim

Vim 教程_w3cschool这个应该是比较详细的信息,以下写的只是常用的

这是除了重定向外唯一的在命令行修改文件内容的方式(大概)

  • 命令模式:使用命令进入后就是,此时是只读状态

  • 输入模式:命令模式下安'a'、'i'、'o'进入输入模式,可从键盘编辑文档

  • 底线模式:命令模式下输入':',然后可以对修改后的文件进行保存或退出

vim fileName    # 使用后进入相应的文件
### 命令模式下,可以使用一些自带的命令,最常用的或许是 dd
# dd,删除当前行
# 5dd,删除当前行及其之后的 5 行,数字可更改
### 命令模式下,点击'a'进入 输入模式
### 输入模式下点击'Ecs' 退回命令模式
### 命令模式下使用 ':wq' 保存退出
# w , 将修改写入文件
# q ,退出 vim
# 有时候忘记用sudo编辑需要权限的文件,修改不能保存,不能正常退出
# ":wq",强制退出

七. 用户管理与组管理

1. 用户和组文件

Linux为多用户多任务系统,每个用户都有一个唯一的UID,同时系统中存在分组,用户也具有GID。用户可以属于多个组,用户对程序的权限是以UID和GID为基础的,执行的程序继承调用它的用户的权利和访问权限,比如用普通用户去运行修改系统内核的程序时会出现权限不足

用户帐号文件:'/etc/passwd'

用户影子文件:'/etc/shadow'

passwd中存放用户的信息,包括密码,用特定的加密算法加密,但加密算法是公开的,shadow是另一道保障,将用户的加密算法保存到这份文件中,且这个文件只有root用户可读,有效提高密码的保护程度

[guyan@DragonBoat /]$ sudo cat /etc/passwd | grep guyan
guyan:x:1000:1000:guyan:/home/guyan:/bin/bash
[guyan@DragonBoat /]$ sudo cat /etc/shadow | grep guyan
guyan:$6$LirAeKzz.xLHsRKp$uvCED--------cdgi2wXhJhS1:19065:0:99999:7:::
# 中间的'-'是我加上去的

相对应的还有gshadow......

其实看不看得到无所谓,我们一般使用命令行修改密码而不是手动修改文件

2. 管理用户和组

2.1 添加用户

# useradd
# 建立一个用户名为 lover,描述信息为"my.lover", 用户组为 home
useradd -r lover -c "my.lover" -g doctor -d /home/lover
# -m 可以为用户创建一个家目录,而不是用 -d 为其指定
# -c 只是一些描述信息,可以忽略,-g 将用户添加到某个用户组,-d 可以指定其家目录路径
# 默认值就是 /home/lover
# 设置密码
passwd lover

一些有意思的选项:

  • -e,设置帐号的过期日期,自动封禁帐号,日期格式:YYYY-MM-YY

  • -k,设置框架目录,创建用户的时候这个目录下文件都被复制到新用户的主目录下

  • -m,自动创建用户主目录,默认/etc/skel,可以用 -k 修改

2.2 修改用户信息

命令:usermod

选项和 useradd 一致

# 将lover的UID更改为 5200
usermod -u 5200 lover
# 将 user01 的用户名改为 user02
usermod -l user02 user01

注意:修改用户ID时,必须确认该ID此时没有在系统上运行任何程序

2.3 删除用户

命令:userdel

userdel userName
# 此时不会删除这个用户的家目录
# -r ,删除用户时同时删除用户的家目录
userdel -r userName
# 即使有 -r 删除家目录,但不能删除该用户非家目录的文件
# 或许可以尝试手动删除

2.4 创建用户组

命令:groupadd

选项:

  • -g 设定组ID
# 创建一个组ID为5400的组,组名 teamate
groupadd -g 5400 teamate

2.5 修改组信息

命令: groupmod

选项和 groupadd 命令的选项相同,额外 -n 可更改组名

# 更改 teamate 组名为 emptyteam
groupmod -n emptyteam teamate

2.6 删除组

命令:groupdel

后面解组名就行了,删除组的时候组内不能有用户

groupdel emptyteam

八. 进程管理

1. linux进程

程序是储存在磁盘上包含可执行的机器指令和数据的静态实体,而进程是在操作系统中执行特斯呢个任务的动态实体

程序与进程为 1:n 关系,进程之间彼此独立

Linux进程类型:

  • 交互进程:由 shell 启动的进程,可在前台或后台执行

  • 批处理进程:这种进程与终端没有联系,是一个进程序列

  • 守护进程:Linux系统启动时的进程,并在后台运行

2. 守护进程

系统开始运行时守护进程同步开启,部分连续运行等待系统出现相应事件后处理、部分周期性运行完成特定任务。

Linux中一些重要守护进程列表

守护进程 功能说明
amd 自动安装NFS(网络文件系统)
apmd 高级电源管理
httpd Web服务器
xinetd 支持多种网络服务的核心守候程序
arpwatch 记录日至并构建一个在LAN接口上看到的以太网地址和I批地址对数据库
autofs 自动安装管理进程automount,与NFS相关,依赖于NIS
bootparamd 引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息
crond Linux下的计划任务
dhcpd 启动一个DHCP(动态IP地址分配)服务器
gated 网关路由守候进程,使用动态的OSPF路由选择协议
innd Usenet新闻服务器
linuxconf 允许使用本地Web服务器作为用户接口来配置机器
lpd 打印服务器
named DNS服务器
netfs 安装NFS、Samba 和 NetWare 网络文件系统
network 激活已配置网路接口的脚本程序
nfsd NFS服务器
portmap RPC portmap 管理器,管理基于RPC服务的连接
postgresql 一种 SQL 数据库服务器
routed 路由守候进程,使用动态 RIP路由选择协议
sendmail 邮件服务器sendmail
smb Samba 文件共享/打印服务
snmpd 本地简单网络管理守候进程
squid 激活代理服务器 aquid
syslog 一个让系统一道时启动 syslog 和 klogd 系统日志守候进程的脚本
xfs X Windows 字形服务器,为本地和远程 X服务器提供字形集
xntpd 网络时间服务器
identd 认证服务,在提供用户信息方面与finger类似

3. 查看及终止进程

3.1 查看进程

命令:ps

ps
### 显示信息
    PID TTY          TIME CMD
  30856 pts/3    00:00:00 bash
  40669 pts/3    00:00:00 ps
# PID 是进程的唯一标识号,PPID 是父进程的唯一标识
# TTY 是该进程占用的终端,"?"表示该进程不占用终端
# TIME 累计使用CPU时间
# CMD 执行程序的命令名
# C 进程最近使用的 CPU 的估算
# STIME 进程的开始时间

ps默认只显示当前最新运行的进程我觉得是

ps 能使用的选项是真的多,建议在命令行使用 --help 查看

# ps 常用用法。a 显示出与tty相关的所有进程的信息
# u 会将进程的显示以用户的形式显示,即标明该进程是由哪个用户执行的
# x 显示所有非控制终端上的进程信息
ps -aux
### 显示信息
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 167408 11076 ?        Ss   Apr02   0:03 /sbin/init
root           2  0.0  0.0      0     0 ?        S    Apr02   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   Apr02   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   Apr02   0:00 [rcu_par_gp]
root           9  0.0  0.0      0     0 ?        I<   Apr02   0:00 [mm_percpu_wq]

命令:top

ps 可以显示系统当前的进程及进程的状态,top 也可以,且 top 是动态的,

top
# 直接使用 top 即可,默认每5秒刷新一次(在我的电脑上心算得出)
# 可以使用 d 指定刷新时间
top d 30 # 每 30 秒刷新一次
# 刷新 5 次,每次间隔 30 秒
top n 5 d 30

3.2 终止进程

命令:kill

前台进程的终止只需要同时按下"Crtrl + C ",而后台进程的终止就需要 kill 命令来终止

# 同时打开两个 终端,在一个里面输入 top,查看其 PID
 41557 guyan     20   0   14204   4568   3552 R   6.9   0.1   0:00.17 top         
# kill 后可直接添加进程的 PID
kill 41557
# 然后就会发现使用 top 命令终端的 top 命令被终止了
# 有时候,如果不想麻烦,可以尝试直接撤销当前 shell 的所有后台进程
kill 0

3.3 暂停进程

命令: sleep

# 使进程暂停 100 秒,然后执行后面的进程
sleep 10 ; ls -l

4. 管理进程

4.1 启动进程

前台启动和后台启动

前台启动会立即看到运行的结果,当然也可能在等待

后台进程可以处理一些不紧急的任务,如复制一个大文件时,如果不关心它的复制进度,就可以将它放到后台,当然,得注意执行完之后进程是正常终止还是错误退出

# 前台启动,直接输入一个命令,如
top
# 后台启动
top & 
# 此时会给出一个进程号,这是这个进程的PID
# 将 top 放到后台是一个憨憨操作

4.2 自动启动进程

如果有一些需要后台执行的进程,且执行时需要占用大量的CPU时间,则可以设置这个进程在夜晚自动执行

定时执行作业

at [-V] [-q aueue] [-f file] [-mldv] time
at -c work01 [work02 ... ]
# -V,如果执行出错,这个选项可以将标准版本号打印到标准错误之中
# -q,使用指定队列,队列名为单个字母,合法的队列名是单个字母,a 是默认
# -m, 执行完成后给执行 at 命令的用户
# -d,删除某个待执行的序列
# -v,显示作业执行的时间
# -c,将命令行上所列的作业
# -f,从指定的文件中读取命令而不是从标准输入中读取
### 关于时间的格式
# 24 小时之内
at 2:00 # 24小时格式,一直等待直到遇到这个时间点
# 一年之内的
at 2:00 4/5/22   # 在 22年4月5号凌晨2:00执行进程
# 某年的可以在上述基础上加上年份即可

# 凌晨两点执行文件 job 中的作业
at -f job 2:00
# 列出队列中的所有作业,同时会显示出作业的 ID
at q
# 删除一个作业
at rm ID

系统资源空闲时执行作业

怎么判断空闲??谁知道,系统说要它觉得空闲那就是空闲

# batch
# 命令格式与 at 大体相同

4.3 周期性执行进程

写的是 contab ,但我的电脑上没有安装,没试过,跳过

4.4 进程挂起及恢复

执行一个命令时,按下"ctrl + z"可以将进程挂起

操作挂起的进程:

  • 命令:fg num/command ,将相应的进程恢复到前台

  • 命令:bg num/command,将相应的进程放到后台执行

  • fg 和 bg 默认对最近被挂起的作业进行操作

可以通过命令jobs查看被挂起的进程

可以通过ps -x查看进程的情况

  1. 一般如果命令没有说明,则命令会对当前工作目录进行操作

  2. ctl 后缀的命令,如hostnamectl,是 RHEL 7 以上的系统才有的,不建议再使用 RedHat 7 以下的系统