重生之我是操作系统(一)----Linux快速入门
linux启动流程
- 首先自检,检查硬件有没有故障
- 从bios中选择启动磁盘
- 启动MBR中的bootloader引导程序
- 加载kernel
- 执行老祖宗进程systemd,所有进程都是它的衍生
- 进入系统
系统目录结构
linux世界里,一切皆文件。
在 Linux 系统中,根目录(/)下的文件夹遵循 FHS(Filesystem Hierarchy Standard) 标准,每个文件夹有明确的用途。
系统核心目录
- bin
binary的缩写,存放二进制可执行文件,比如常用的命令等,供所有用户使用 - sbin
S就是super的意思,存放系统管理员(root)所使用的工具 - etc
存放各种配置,包括system与application。比如ssh/sshd_config,mysql.config - boot
存放系统启动文件。比如内核,引导程序
开机流程
开机=>BIOS=>/boot=>systemd进程=>运行级别=>运行级别对应的服务
用户相关目录
- home
普通用户的主目录,每个用户一个目录 - root
管理员用户的主目录,代表着最高权限 - tmp
临时文件,重启后自动清空 - var
经常变化的数据,比如日志,缓存等 - run
运行时数据目录,存放当前系统运行的临时数据(如进程 PID 文件、套接字)
程序与库目录
- usr
存放用户级程序和文件,类似windows中的Program Files。比如/usr/bin:普通程序, /usr/sbin:系统管理程序, /usr/share:共享资源(如文档、图标) - lib/lib64
存放系统运行所需的库文件,类似Windows中的DLL,几乎所有程序都需要用到这些共享库 - opt
用于安装软件的额外目录
设备与挂载
- dev
类似windows中的设备管理器,把所有硬件用文件的形式存储。比如硬盘dev/sda,串口dev/ttyS0 - mnt
用于临时挂载外部存储,比如U盘,共享目录等 - media
系统自动挂载外部设备的目录(如插入 U 盘会生成 /media/usb)。
特殊虚拟目录
- proc
虚拟文件系统,主要存储系统信息,比如proc/couinfo,proc/meminfo - sys
虚拟文件系统,提供内核和硬件信息 - lost_found
文件系统恢复目录,当文件系统检测到错误时,会将丢失的文件碎片存放在这里(每个分区独立存在,如根目录的 /lost+found)。 - srv
服务数据目录,用于存放服务器提供的服务数据(如网站 /srv/www、FTP 文件 /srv/ftp),由管理员手动维护
远程连接
使用XShell,Xftp
VI VIM
- 正常模式
以vim命令进入后,默认今日此模式 - 插入模式
按下i,o,a,r这四个健,进入编辑模式
退出插入模式,输入esc再输入:
即可
几个常用命令
- wq保存并退出
- q,q!退出不保存
- yy 拷贝当前行 5yy=拷贝5行
- dd 删除当前行 5dd=删除5行
- p粘贴,配合yy使用
- /搜索关键词, n是高亮显示下一个
- set nu/set nonu 显示/取消行号
- G快速切换到最末行,gg快速切换到最首行
- u 撤销,类似windows下Ctrl+z
- 先输入20,再按shift+g 快速定位到第20行。
实际上20G ,20gg也是同样的
关机/重启,登录/注销
- shudown
shudown -h now:立刻关机
shudown -h 1 :1分钟后关机 - halt
同上,-h的参数就是代表dalt - reboot
重启 - sync
不管是重启系统还是关闭系统,首先要先运行sync命令,把内存中的数据写入磁盘
登录时尽量少用root账号登录,因为权限很大。
可以利用普通用户登录,登录后再用su -用户名来切换成系统管理员身份,操作完后再使用exit来退出root,避免误操作。
用户管理
- 添加用户
useradd 用户名
user -d /home/test king 指令目录 - 修改密码
passwd 用户名 - 删除目录
userdel 用户
userdel -r 用户 ,删除用户及删除文件夹 - 查看用户
id 用户名 - 切换用户
su 用户名
注意:高权限切换到低权限用户,不需要密码。需要切换回原来用户时,使用exit/logout指令 - 查看当前登录用户
who am i/who
用户组
类似角色(Role),在linux中的每个用户都必须属于一个组,不能独立于组外。
- 添加组
groupadd 组名 - 删除组
groupdel 组名 - 添加用户时,直接加上组
useradd -g 组名 用户名 - 修改用户组
用户组相关文件
-
etc/passwd
用户名:密码:用户标识:组标识:注释:主目录:登录Shell
-
etc/shadow
密码的配置文件
登录名:加密密码:最后一次修改事件:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
-
etc/group
组名:密码:组标识
实用指令
运行状态
linux存在7个运行级别,也可以理解为运行状态
0. 关机
- 单用户
可以利用此模式找回密码 - 多用户无网络
?毫无意义 - 多用户有网络
- 保留
无意义 - 图形界面
- 重启
最常用的是init 3,init 5
帮助指令
- man 指令名
比如man ls - help
比如 help cd
文件目录指令
-
切换目录
cd 路径
2.列出所有文件
ls,结合 -a -l 可以列出隐藏文件与单列显示. -h 更加友好的显示方式
在linux系统中,隐藏文件以.XXX 开头 -
创建目录
mkdir,默认只能创建一级目录。
需要加入-p 才能一次性创建多个目录 -
删除目录
rmdir ,删除空目录,如果有文件则删不了
-
创建空文件
touch -
拷贝
cp source desc -
删除
rm ,既可以删除文件,又可以删除目录
-r 递归删除
-f 强制删除不提示 -
移动文件或者重命名
mv oldname newName (两个文件在同一个目录,就是重命名,也就是覆盖)
mv 不同路径,则是移动文件 -
只读查看
cat -n 显示行号,- more 翻页
还有 less指令,与more类似,它是懒加载模式,more是整个文件加载后才显示,less是根据要加载的内容。
-head 显示文件开头部分内容,比如head -n 5 /etc/profile
-tial 显示文件末尾部分内容,比如tail -n 5 -
控制台输出
echo echo %HOSTNAME,echo "nnnnn" -
输出重定向与追加
》,》》
-
快捷方式
ln ,类似windows的快捷方式 -
历史指令
history ,查看命令历史记录, !XXX ,执行执行过的第多少号命令
时间日期
- 当前时间
date
date -s "2025-11-03 20:02:10" 设置当前系统时间 - 当前日期
cal
cal 2020 ,显示2020年整年的日历
搜索/查找
-
搜索
find,从指定目录下递归遍历子目录 -
快速定位文件路径
locate,locate利用事先建立的索引,无需遍历整个文件系统。但为了准确度,管理员需要定期更新locate -
查看指令在那个目录下
which XXX
-
过滤查找
grep
grep -n "hh" /root/bbb/a.txt
压缩/解压
-
压缩
gzip/zip
格式为xxx.gz,源文件会消失 -
解压
gunzip/unzip
-d 指定到目标文件夹 -
打包
tar 与上述不同的是,tar是讲多个文件合并为一个,而zip是压缩,节省存储空间
-c 产生tar压缩文件
-x 解压文件
-v 显示详细
-f 指定压缩文件名
组
文件/目录所有者
-
查看文件的所有者
ls -ahl
-
修改文件所有者
chown (changeowner) 用户名 文件名 -
修改文件所在的组
chgrp(changegroup) 组名 文件名 -
修改用户所在的组
usermod -g 新组名 用户名
权限
权限一共有10位
- 0位
确定文件类型
l是连接,类似windows快捷方式
d是目录
c是字符串设备文件,比如鼠标,键盘
b是块设备,比如硬盘 - 1-3位
r=read
w=write
x=execution
也可以用数字表示
r=4
w=2
x=1
确定所有者拥有该文件的权限----User - 4-6位
确定所有组拥有该文件的权限----Group
修改权限
chmod 指令,可以修改文件或者目录的权限
u:所有者,g:所有组,o:其他人 a:所有人(u,g,o的总和)
chmod u=rwx,g=rx,o=x
chmod u=rwx,g=rx,o=rx
定时任务
crond 任务调度
比如定时备份mysql ,定时与服务器同步更新时间等
crontab [选线]
-e 新增/编辑
-l 查询list
-r 删除所有的
示例:*/1 * * * * ls -l /etc/ > /tmp/to.txt 每分钟执行etc目录所有文件覆盖到to.txt
at 一次性任务
at的守护进程atd以后台模式运行,默认情况下每隔60秒检查作业队列。如果时间与当前时间匹配,则运行此作业。
实用atd命令时,一定要保证atd进程的启动。
ps -ef |grep atd 检测atd进程是否还在运行
linux分区
linux无论几个分区,分给哪个目录使用。本质上就是一个根目录。
linux采用了"载入"的处理方法,将一个分区和一个目录联系起来。
- 查看挂载的分区
lsblk
- 分区命令
fdisk /dev/xxxx
- 格式化分区
mkfs -t ext4 /dev/xxxx - 挂载分区
mount
mount /dev/sdb1 /newdisk - 卸载分区
umount
umount /dev/sdb1 - 永久挂载分区
使用命令行,在重启后,挂载关系会失效。
通过修改 vim /etc/fstab 实现永远绑定
磁盘情况查询
- 基本情况
df -h
du -h 可以查看某个目录的磁盘使用情况
实用指令
- 统计文件个数
ls -l /opt|grep "^-"|wc -l - 统计目录个数
ls -l /opt|grep "^d"|wc -l - 统计文件个数,包括子文件
ls -lR /opt|grep "^-"|wc -l -
- 统计目录个数,包括子目录
ls -lR /opt|grep "^d"|wc -l
- 统计目录个数,包括子目录
- 以树状显示目录结构
网络配置
原理:
可以直接修改配置文件来指定IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改完成后,service network restart 或者reboot 使配置生效
主机与hosts映射
- 修改主机名
cat /etc/hostname
修改完成后,重启生效 - 映射主机名
cat /etc/hosts
进程
每个进程分为前台进程与后台进程。
- ps -a
显示所有进程信息 - ps -u
以用户的格式显示进程信息 - ps -x
显示后台进程运行的参数
经常组合在一起 ps -aux
父子进程
ps -ef 查看父子关系,除了0号进程,否则一个进程必须由另一个进程所创建。在windows上也是同理的
终止进程
kill [选项] 进程号
killall 进程名,注意实用此命令,子进程也会被杀掉
进程树
pstree 可以更加直观
服务(service)管理
service本质就是进程,就是后台进程。一般情况下会监听某个端口,来提供服务。
service 服务名 [start|stop|restart|reload|status]
centOS7.0后,很多服务不再使用service,而是使用systemctl来管理。
可以使用ls -l /etc/init.d/ 命令来看哪些服务可以用service来使用
也可以用steup
chkconfig
linux的7个运行级别,可以通过chkconfig来配置,在什么级别要不要设置自动启动
例子:chkconfig --level 3 network off
需要重启机器才生效
systemctl
可以在 usr/lib/systemd/system 中查看受systemctl管理的列表
systemctl [start|stop|restart|status] 服务名,注意此时是临时生效,重启后会恢复默认设置。
使用enable / disable 才是永久生效
使用ls -l /usr/lib/systemd/system 查看可以操作的service
firewall 防火墙
在真正的生成环境中,是需要指定开放端口的。
监控
系统监控
top [选项]
-d 3 每隔3秒更新
-i 不显示任何闲置/僵死的进程
-p 通过特定process id 来监控
可以按下E 来切换mb,gb显示格式
P 按照CPU使用率排序
M 内存使用率排序
N 按照PID排序
q 退出
网络监控
比如哪些进程正在监听端口
netstat [选项]
-an 按照一定顺序排列输出
-p 显示哪个进程在调用
io监控
iotop
RPM&YUM&APT包管理
RPM
rpm用于互联网下载包的打包和安装工具,是ReadHat Package Manager的缩写,类似windows的setup.exe
-
简单查询
rpm -qa|grep xxx
-
卸载
rpm -e xxxx
-
安装
rpm -ivh xxxxx
i=install
v=verbose 提示
h=hash 进度条
YUM
yum是一个shell前端软件包管理器,能够从指定服务器自动下载RPM包安装,自动处理依赖性关系。类似应用商店。
APT
APT是ubuntu的包管理软件,与YUM类似
Shell编程
Shell是一个命令行解释器,可以用Shell来启动,挂起,停止,编写程序
注释
单行#
多行:<<! xxxx !
变量
$HOME,$PACH都是系统变量,可以通过set来查看
命名与C#差不多,别用数字开头就行。
切记一点 A=100,等号两边不能有空格
也可以持有引用 A=$(B)
全局变量
export 变量名=变量值(将shell变量输出为全局变量)
source 配置文件(使配置生效)
传参数
类似C#中 Method(param1,param2)
预定义变量
$$ 获取当前进程号
$! 后台运行的最后一个进程的进程号
$? 最后一次执行命令的返回状态
运算符
expr 1 + 1
+,-,*,/,%
加,剑,乘,除,取余
注意中间有空格
条件判断
[ condition ]
返回有值为true,空值为false
#!/bin/bash
if [ $1 -ge 60 ]
then
echo “及格了”
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case
循环
读取输入
类似Console.Read
自定义方法
#!/bin/bash
function getSum(){
SUM=$[$n1+$n2]
echo "和为$SUM"
}
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
getSum $n1 $n2
日志
日志核心进程 rsyslogd
可以通过/etc/rsyslog.conf 文件来配置日志记录到哪里。
自定义日志
日志轮替
说人话就是定期迁移/删除日志,其原理是依赖cron定时任务。
仔细观察/etc/cron.daily 目录,就会发现logrotate的影子
配置文件在cat /etc/logrotate.conf
cd /etc/logrotate.d/ 自定义的轮替配置可以放在这个文件下,方便维护。如果放在logrotate.conf主配置中就会越来越多。
内存日志
在linux中,有一部分日志先写内容,再写磁盘。系统重启后会清空。
所以当某些日志找不到的时候,可以去内存日志里查看。
journalctl
备份与恢复
主要依赖dump与restore两个命令
很少操作,主要是结合crontab实现自动化备份命令