linux中一切皆文件
指令
- 指令也是程序,可以使用
which 指令来查询该指令的程序在哪个位置,但对shell内置的指令如cd不生效- 指令是有输入的,通常
参数最后的指定文件即是输入来源,只是有的指令默认了输入文件位置,所以省略不写,比如ls ./默认写成ls- 管道|,将左边指令的标准输出直接给右边指令,此时右边指令就不需要指定来源
- 输入重定向<,grep "text" << file.txt等价于grep "text" file.txt
- 输出重定向>或>>,将指令的输出由标准输出(屏幕)指定到特定文件中,前者覆盖写,后者追加写
- 错误输出重定向2>或2>>,与输出重定向类似,只是输出的是错误信息,可与上面指令写在一个指令中,
command > output.log 2> error.log- 组合重定向&>或&>>:同时重定向stdout和stderr
1. 文件结构
根目录:/
- bin:shell指令
- sbin:管理员才能执行的shell指令
- home:普通用户家目录
- root:管理员主目录
- lib:库文件
- lost+found:宕机后存储恢复信息
- *etc:系统管理所需要的配置信息
- usr:用户的应用程序和文件
- local:用户安装程序目录
- opt:安装包存放的位置
- var:不断扩充的东西,如日志
- temp:临时文件,都可以访问,也会定期删除
- dev:设备管理器
- media:自动识别的设备,比如U盘
- mnt:挂载
- selinux:安全子系统
- boot:启动相关文件
- proc:系统内存映射
- srv:启动后要提取的数据
- sys:2.6之后内核出现的新东西
2. vi/vim:后者是前者增强版本,如多了语法高亮
3.用户管理、组管理
每个文件都有一个所有者(用户),每个所有者都存在一个组
相关文件/etc/
- passwd:存放用户信息(如 UID、主目录等),都可以访问
- shadow:存放口令配置信息(如加密后的密码,密码修改时间),只有root可访问
- group:组的基本信息
组管理
- groupadd 组名
- groupdel 组名
用户管理
- useradd 选项 用户名
- -m:会自动增加同名家目录到/home/下
- -d 路径:指定家目录
- userdel 选项 用户名
- -r:删除用户的同时删除其家目录
- usermod 选项 用户名
- -g 组名:改变用户所属组
- -d 目录名:改变用户家目录
- passwd 用户名:给用户的设置密码,默认给自己
- su - 用户名:切换用户,输入exit切换回原来的用户
- whoami:查看登录用户名
- id 用户名:查询用户
4. 文件管理
基本常识(很重要)
文件系统的核心作用是管理块设备(如磁盘分区),并提供标准化的API(如open/read/write)来操作磁盘
- 文件分为目录和普通文件
- 文件拥有权限属性rwx
- 对文件:r可读,w可修改内容(不代表可删),x可执行
- 对目录:r可被ls列出,w可重命名,可内部增删文件,x可进入该目录
- 不同用户对于文件而言有不同身份(所有者u,组成员g,其他组成员o),导致对于文件的权限不同,具体可看如下图
操作指令
增
- mkdir 选项 目录名
- -p 递归创建,如果父目录不存在会自动创建
- touch 文件名
- ln 目标路径 链接名:创建硬链接文件
- -s 创建软链接文件
删
- rm 选项 文件(目录)路径
- -r递归删除,如果删除目录中存在目录,则必须增加此
- -f强制删除,不会再要求输入确认
改
- cd 路径:跳转到该路径下
- vim 文件名
- mv 源路径 目标路径
- 若源路径与目标路径相同,则为重命名
- 不同则为移动
- chown 用户名 文件名:改变文件所有者
- chgrp 组名 文件名:改变文件所属组
- chmod 操作 文件名
- 操作方法一:+-=变更权限,u所有者,g组内成员,o其他成员
- 如chmod u=rwx,g=rx,o=rx abc
- 如chmod u-x,g+w abc
- 操作方法二:r=4,w=2,x=1
- 如 chmod 765 abc 等价于 chmod u=rwx,g=rw,o=rx abc
- cp -r 源路径 目标路径:将源文件(目录)拷贝到目标文件(目录)中
- \cp -r 源路径 目标路径:强制覆盖
- scp 选项 源路径 目标路径:Linux之间跨网络复制文件和目录
-r:递归复制整个目录。- 远端路径格式:
用户名@IP地址:路径,如root@192.168.31.186:/root/example.txt
- truncate 选项 文件名:设置文件大小,如果文件不存在,会创建文件
- -s 512:设置文件大小为512字节,如果比原文件小,则会丢弃后面内容,如果比文件大,则填充\0
- -o:设置文件大小单位为io块
- -c:不创建文件
查
- ls 选项
- -i 显示文件(包括目录)名和对应的iNode编号
- -a 显示所有文件
- -l 单行显示文件
- -r 递归显示所有子文件
- -h 以人类可读格式显示
- -t 按修改时间排序
- cat 选项 文件名
- -n 显示文件内容的同时显示行号
- more 文件名:全屏按页显示文本文件内容
- 空格:下翻一页
- 回车:下翻一行
- q:退出
- =输出当前行
- :f输出文件名和行号
- less 文件名:也是全屏显示,但是并不是全部加载进内存才显示,适合查看大文件
- 空格/pagedown
- pageup
- q:退出
- /字符串或?字符串:查找字符串
- n/N 向下/上查找
- head -n 行数 文件:查看文件前几行
- tail 选项 文件 -n 行数:查看文件后几行 -f 实时跟踪文件,用于服务器输出日志 -F 更强大,即使文件重命名或重建,也会一直跟踪
- find 搜索范围 选项 字符串:搜索文件目录中的文件
- 搜索范围
- 即指定在哪个目录下查找
- 选项
- -name:用文件名匹配字符串
- -user:用所有者匹配字符串
- -size:+n大于n,-n小于n,n为等于,单位KMG,如+1M代表>1M
- grep 选项 查找内容 文件路径:搜索文本文件中的内容
- -n 返回内容包括行号
- -i 查找时忽略大小写
- wc 选项 目录:word count
- -l 按行统计
- -w 按单词统计,以空白符为分割
- -c 按字符统计
- tree 目录路径:以树状图显示目录结构
- pwd:查看当前处于的文件夹
- cd ~:回到家目录,root则回到/root/
5.硬盘管理
基础知识
- 文件系统是os用于管理多个磁盘的逻辑结构,使得用户对磁盘 操作的基本单位变成了文件
- 电脑可以有多个磁盘,一个磁盘可以有多个分区,每个分区对应一个文件系统,然后挂载到一个目录下,对目录的操作就是对磁盘的操作
- Linux中同时也是将磁盘、分区组织成块类型(b)文件,只能将其挂载到目录下才能操作,不可直接操作
- 每个磁盘都分为引导块和数据块,引导区在第一个扇区(512B),引导区内容MBR分为引导代码、分区表(64字节)和结束标志(表示则是有效的MBR扇区)
- 分区表记录着分区的位置,每个分区信息占据16B,所以只能有4个分区,但是明显不够,后续就将这4个16B分成了主分区、拓展区和逻辑区
- 拓展分区把其中一个主分区变成容器,内部再套娃(逻辑分区),从而达到将硬盘分为>4的分区
- MBR是老版本,最新的方式是GPT,使得分区没有限制且磁盘容量大于2T,(因分区表用32位记录扇区数2^32×512B≈2TB)
- 同时之前的BIOS(Legacy)由于每次启动都需要检查硬件并对其初始化,所以开机较慢,目前最新的是UFIE,能跳过这部分直到硬件出现问题才会检测,使得开机变快
- 分区又分为系统分区和普通分区,系统分区不同的是起始位置存储着os引导程序,来将os加载到内存,然后将控制权交给os,此时也就开机成功
- 每个磁盘分区有多个部分:超级块、iNode区和数据区等
- 每个文件都指向一个iNode节点,记录着:
- 文件描述内容,比如文件修改时间,文件类型
- 文件存储的数据在磁盘什么位置,目录文件中的数据就是目录项,目录项由文件名及其对应的iNode节点编号组成
拓展:系统根据iNode编号获得对应的iNode,当使用ls -l:
1.首先根据本目录的iNode节点获得子文件iNode节点编号
2.再去读子文件的iNode节点以获得子文件的描述,然后再输出显示
- 硬盘想要被文件系统使用,必须先挂载到某个空目录之下(原有内容会被隐藏,卸载当前挂载的硬盘后内容会恢复),但是挂载之前硬盘中没有合适的文件系统,则需要格式化
浅谈格式化
文件系统要想管理磁盘分区,就得依赖一些元数据,比如inode表和数据块分配表,格式化就是在产生这些数据(即创建文件系统),同时将空间分为iNode节点空间和数据区等
挂载浅谈
- 挂载就是将块设备的文件系统挂到操作系统的文件系统中,此时os下的文件系统才会去按照文件的方式管理这块设备
- Linux默认所有块设备都是按照顶级目录到子目录的方式进行管理的,所以挂载就是将指定的目录代替成块设备的顶级目录,这样进入指定的目录,就是进入了块设备
挂载后
- 系统启动过程
1. BIOS/UEFI 初始化
- 传统BIOS:
- 读取磁盘第一个扇区(MBR,512字节),检查最后2字节是否为
0x55AA。- 加载MBR中的Stage 1引导代码(如GRUB的
boot.img)到内存0x7C00执行。- UEFI:
- 直接读取ESP分区(FAT32格式)中的
.efi文件(如grubx64.efi),跳过MBR。2. GRUB 引导加载
传统BIOS模式(GRUB2)
- Stage 1(MBR中) :
- 仅446字节,功能是加载Stage 1.5(
core.img)。core.img通常存储在MBR后的空闲扇区(约30KB),包含基本文件系统驱动(如ext4、FAT)。- Stage 2(完整GRUB) :
- 从
/boot分区读取配置文件(grub.cfg)。- 加载内核(
vmlinuz)和initramfs到内存。UEFI模式
- 直接执行ESP分区中的
grubx64.efi,无需core.img(因UEFI自带FAT32驱动)。3 内核与 initramfs
- 内核限制:
- 内核自身不包含所有硬件驱动(如LVM、加密模块),这些驱动存储在根文件系统的
/lib/modules中。- 但挂载根文件系统需要这些驱动 → 死循环。
- initramfs 的作用:
- 提供临时根文件系统(内存中),包含:
- 必要的磁盘驱动(如
dm-crypt、nvme)。- 工具(
mount、vgchange、cryptsetup)。- 解锁加密/LVM卷,挂载真正的根文件系统(如
/dev/mapper/ubuntu--vg-root)。4. 根切换与系统启动
pivot_root:
- 将initramfs的临时根切换到真实的根文件系统。
- 卸载initramfs释放内存。
- 启动用户空间:
- 执行
/sbin/init(或systemd)。- 根据
/etc/fstab挂载其他分区(如/home)。
相关文件
/etc/fstab:启动后自动挂载的文件系统配置,file system table
操作指令
1、增加硬盘
- fdisk 磁盘路径:对磁盘分区,分区后需重启系统
- m获得帮助
- n开始分区,后续按提示开始分区
- 结束后按w写入磁盘
- 按q退出,若没有按w,不会记录
- mkfs -t 文件系统类型 分区目录:格式化磁盘分区
- make file system
- 文件系统类型可以输入mkfs后按两下tab获得
如果挂载的文件原本不是空的,说明这块磁盘分区对应部分有数据,直接挂载的话,此时会由于磁盘分区不同而导致"数据丢失";但是如果把新挂载的卸载掉,数据就会回来,因为此时文件就是管理的之前磁盘分区对应位置的数据
- 挂载
3.1 mount 分区目录 挂载目录:将硬盘分区挂载到指定目录,重启后会丢失
3.2 umount 分区目录或挂载目录:重启后也会丢失
3.3 写入/etc/fstab,每次启动会自动挂载,且并不是写挂载目录,而写的是磁盘分区的uuid
2、查询硬盘
- lsblk:列出所有块设备,包括磁盘及其下面的磁盘分区
- blkid 磁盘目录:查询磁盘分区的uuid,默认显示所有
- df -h:查所有磁盘利用率
- du 选项 路径:查指定目录占用的磁盘空间
- -h 带计量单位
- -a 含文件
- -c 增加汇总值
- --max-depth=1 子目录深度为1
3、LVM逻辑卷
传统磁盘是一个磁盘分区格式化挂载,无法做到将多个磁盘同时挂载到一个目录下
LVM是将多个磁盘/磁盘分区变为物理卷PV(physical volume),然后将多个物理卷变为卷组VG(Volume Group类似于大磁盘),然后从VG中分配逻辑卷LV(Logical Volume类似于分区)
对于卷组VG,存在最小分配单元PE(Physical Extend),一般是4MB
逻辑卷命名:
etc/卷组/逻辑卷
etc/mapper/卷组-逻辑卷
- 创建:PV->VG->LV
- 扩容:对逻辑卷分配内存后,还需要通知文件系统,不同文件系统有不同的指令,如
xfs使用xfs_growfs 逻辑卷
6. 进程管理
基础知识
- 进程分为普通进程和服务(守护进程);
- 普通进程并不是说转为后台后就变成了服务,普通进程可能会随着本次终端关闭而停止,而服务却是独立运行于终端之外的,由systemctl专门管理;
操作指令
- ps 选项
- -e 显示所有进程(侧重于进程间的父子关系)
- -f 全格式显示
- aux 以人可读方式显示所有用户进程(侧重于资源占用)
- kill 选项 进程号:有时候进程会忽视此命令,必须强制执行
- -9 强制终止
- killall 进程名称:停止所有与名称匹配的进程
- pstree 选项:显示进程树,能看见父子关系
- -p 显示进程号
- -u 显示用户
- systemctl 选项 服务名
- start/stop/restart 启动/停止/重启服务
- status 查看服务进程状态,是否处于运行
- list-unit-files 查服务开机启动状态
- enable/disable 设置/关闭服务开机自启动
- is-enabled 查询某个服务是否自启动
- service 服务名 选项
- start/stop/restart/status
- reload 重新装载服务
- top 选项:动态监控进程
- -d 5:每5s更新一次
- -p PID:监控某个进程
- 交互:按P以CPU排序,M以内存,N以PID,U查询该用户执行的进程,K杀死某个进程
7、网络管理
基础知识
- 虚拟机、容器的网络管理有很多方式,常见的桥接和NAT
- 桥接:分配一个与宿主机同一局域网的独立 IP 地址,这样就可以通过网关直接访问外部服务器,相当于一张网卡有两个IP
- NAT:虚拟机和主机组成一个局域网,分别配置网关以及各自在此局域网中的IP地址,虚拟机访问外部网络,数据由虚拟机->网关->主机,然后由主机发送出去
- ssh:全称是security shell,意在通过shell能控制所有远程电脑,比较与telnet更加安全,端口号22
操作指令
- ifconfig:查看网络信息,Windows系统是ipconfig
- ip 选项 操作:比ifconfig更加强大
- addr/route show:显示ip地址/路由表
- neigh:查看ARP缓存表
- addr add/del IP地址/掩码 dev 网卡:添加/删除网络接口IP地址
- ping IP地址:测试网络是否有问题
- netstat 选项:动态监控网络
- -an 以一定顺序输出
- -p 显示进程
- ssh 用户名@IP地址:连接并操控远程服务器
- nslookup 域名:DNS查询
- traceroute 域名:路由跟踪,TTL从1开始递增,直到数据包到达目的地址,每次显示的是中间路由器返回的ICMP包
实操
1、将IP改为静态获取
- cd /etc/netplan,找到里面yaml文件
- 在网卡之下添加addresses、routes和nameservers等配置信息,务必注意格式,不能有tab,只能是空格
- netplan apply,配置生效
2、ssh远程连接服务器
- 服务器端,/etc/ssh/sshd_config中记录着ssh的配置信息,如果允许远程登录root,则需要添加PermitRootLogin yes
- 客户端,直接使用ssh 用户名@服务器IP,然后输入密码后即登录成功
8、软件包管理Ubuntu
基础知识
- apt的安装包都来自于etc/apt/sources.list.d/ubuntu.sources中记录的服务器,原本都是记录的外网的地址,需要手动改为内网镜像
镜像:其实就是国内服务器,将外国的服务器的资源定期扒拉,这样就与访问国外服务器效果一致
- 如果没有包管理工具,仅仅下载软件是不行的,还得安装许多依赖,不同软件的依赖可能有冲突,这对手动维护无疑是大挑战
基本操作
apt包管理
- apt update:“眼”,先获得apt服务器中的元信息(如软件列表、软件版本)存储到/var/lib/apt/lists中
- apt upgrade:更新已下载软件
- apt install 软件名=版本号:“手”,根据名字,获得元信息,然后请求服务器相关数据
- apt source 软件名:获取软件源代码
- apt show 软件名
- apt remove/purge 软件名:前者会留下配置文件,后者彻底删除
- apt autoremove/clean:清理无用依赖/缓存文件
网络资源
下载
1.wget
wget就是用来从指定的url下载文件,包括ftp,类似于迅雷
- wget 选项 url:默认下载到当前文件夹,并以url中最后一个/之后 的字符来命名下载的文件
- -O 字符串:以指定字符串命名下载文件
- --limit-rate=300k:限速下载,因为默认是全部宽带下载,如果下载其他文件就没法使用带宽
- -c:断点续传,重新启动下载中断的文件,而不会从头开始下载
- -b:后台下载,同时将下载进度记录到wget-log,使用tail -f wget-log能实时查看当前进度
- -i 路径:根据路径指定的文件中的多个url,来同时下载多个文件
- --ftp-user=USERNAME --ftp-password=PASSWORD:ftp下载,当然不输入这些则是匿名下载
2.curl
不带任何参数,就是发出get请求,类似于浏览器
1.curl 参数 url
- -d 字符串:发送POST方法,并设置请求头content-type
- -H 字符串:自定义请求头内容
- -O:注意是大写O,用于下载
- -o 字符串输出保存到指定文件,wget是大写O
3.打包
打包并不等于压缩,打包类似于将多个文件的内容全部copy到一个tar文件中
- tar [options] -f archive.tar [files...]
-f:指定归档文件的名称,必须要
- -c:创建新的归档文件,后缀名为tar
- -r:向指定的tar文件中添加文件
- -x:解包归档文件
- -t:列出归档文件中的内容(被归档文件)
- -z:使用gzip压缩或解压归档文件
- -j:使用bzip2解压压缩归档文件
- -v:显示详细输出,列出被添加到归档中的文件
4.压缩
- tar -czvf xxx.tar.zip [files]
- zip 选项 xxx.zip [dirs,files]
- -r:递归添加,如果不添加的话,
压缩包中不包括子目录之下的文件 - -P 密码:大写P,加密压缩
- gzip 选项 [files]
- d: xxx.gz:解压
- r:递归压缩
5.解压
- tar -xzvf xxx.tar.zip
- unzip 选项 xxx.zip:解压后默认会删除压缩包
- -d 指定解压路径
- -l 列举压缩文件的内容
- -P 密码:指定密码解压
- -k:保留原始文件
- gunzip 选项 xxx.gz
- 选项同上
9、其他常用指令
日期
- date 选项:默认显示当前时间
- -s 时间:设置时间
- cal:显示日历
任务调度
cron服务处于后台,查询相应配置,来定时执行指定任务;用crontab指令来编辑配置
- crontab 选项:系统在某个时间执行特定命令
- -l:查询crontab中的任务
- -r:删除当前用户的cron任务
- -e:编辑任务,其实就是编辑对应文件