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上详细无比,自认自己做不到写得更好,做个粘贴怪,这是链接
一些注意事项:
通过包管理器安装的软件包是默认安装在根目录下的,不要轻易去改动安装位置,我曾经试过去改动位置,导致部分软件无法运行
很多教程里都只是给根分区划分了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)
cd和ls一定是在使用系统的过程中使用最频繁的命令,一定是
# 一般我们称当前在文件系统中的位置为工作目录
# 使用下面的命令可以查看当前的工作目录
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
head和tail使用-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里很流行的程序,vi 和 vim
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查看进程的情况
附
-
一般如果命令没有说明,则命令会对当前工作目录进行操作
-
ctl 后缀的命令,如hostnamectl,是 RHEL 7 以上的系统才有的,不建议再使用 RedHat 7 以下的系统