设备管理
Linux系统中设备是用文件来表示的,每种设备都被抽象为设备文件的形式,这样,就给应用程序一个一致的文件界面,方便应用程序和操作系统之间的通信。
设备文件集中放置在/dev目录下,一般有几千个,不管有没有对应的真实设备,Linux系统在安装的时候都会自动预先创建。
磁盘设备
Linux系统磁盘设备命名方式遵循一定的规则。
前两个字母表示分区所在设备的类型:
- hd:IDE硬盘
- sd:SCSI硬盘(U盘,移动硬盘等)
第三个字母表示分区在哪个设备上 - hda:第一块IDE硬盘
- sda:第一块SCSI硬盘
- sdb:第二块SCSI硬盘
数字表示分区的次序:
- hda1:第一块IDE硬盘第一分区
- sdb2:第二块SCSI硬盘第二个分区
查看硬盘及分区情况
fdisk -l
lsblk
挂载的文件系统类型
可以挂载:ext、FAT、NTFS 、 ext2(extended file system )、ext3、MINIX、MSDOS、SYSV
- Linux系统的第一个文件系统是Minix(文件名不能超过14个字符,文件大小不能超过64MB)
- ext:1992年设计,是第一个专为linux设计的文件系统,文件大小可到2GB,文件名支持255字符,性能不佳
- ext2: 1993年设计,提高性能
- ext3:采用日志式文件系统技术(Journaling File System,独立的日志文件跟踪磁盘内容的变化),目前各个linux发行版使用
VFS
Linux引进ext文件系统时有了一个重大的改进:把文件系统从操作系统和系统服务中分离出来,在它们之间使用了一个接口层—虚拟文件系统VFS(Virtual File System)
Linux系统可以支持多种文件系统,为此,必须使用一种统一的接口,这就是虚拟文件系统(VFS)。通过VFS将不同文件系统的实现细节隐藏起来,因而从外部看上去,所有的文件系统都是一样的。
VFS并不是一个实际的文件系统:只存在于内存,系统启动时建立,系统关闭时消亡
VFS功能包括:
- 记录可用文件系统的类型
- 将设备与对应的文件系统联系起来
- 处理面向文件的通用操作
- 涉及到针对文件系统的操作时,把他们映射到相关的物理文件系统
挂载设备信息
计算机系统中,所有的存储设备都是以目录树的形式对文件进行管理的 。
在Linux系统中,所有的文件都是在以“/”目录为根的一棵“大”目录树中进行管理。
如果要使用USB存储设备、光盘或软盘等存储设备,必须将这些设备中的“小”目录树像嫁接一样挂载(mount)到Linux系统的“大”目录树中。
挂载对象的文件系统类型:/proc/filesystems
vfat (fat32) ext2 ext3 iso9660
挂载对象的设备名称;
在Linux系统中,设备名称通常都在/dev目录下,设备名称的命名是有规则的 ;
/dev/hda1 /dev/sda2 /dev/fd0 /dev/cdrom
设备挂载到哪一目录,即挂载点。
Linux系统中有一个/mnt目录,专门用作挂载点(mount point)目录
在挂载设备时首先查看挂载点目录是否存在,如果不存在必须首先创建该目录,否则mount命令无法正常执行。
挂载设备过程
- 查看设备:使用命令“fdisk -l”可以查看系统的存储设备
- 挂载设备 :首先使用mkdir命令建立挂载点目录,然后再使用mount命令挂载相关设备
- 访问设备
- 卸载设备 :用户在使用完挂载设备后,不能直接将挂载设备从系统拔出,否则会出现问题,严重的会导致系统崩溃。用户必须先执行卸载命令然后再该设备拔出
umount [挂载点或设备名]
mkfs
mkfs [选项][-t <文件系统类型>] [设备名称] [区块数]
说明:把指定的设备格式为指定的文件系统。
例如
- 格式化硬盘时:
mkfs -t ext3 /dev/hda4
- 格式化软盘时,需要指定设备名和区块数,每个区块大约1000个字节,一张1.44MB的软盘对应1440个区块。格式化指令为:
mkfs -t ext3 /dev/fd0 1440
mount
mount [选项] <挂载设备名称> <挂载点>
选项:
- t 挂载的文件系统 [ext2 ext3 vfat iso9660]
例如:
mount -t ext3 /dev/fd0 /mnt/floppy - o [参数=值] ,对于挂载的不同类型的设备可以使用一组不同的参数。[ro rw auto iocharset]
mount -o iocharset=cp936 /dev/sda1 /mnt/usb
df
磁盘空间使用情况
df [选项]
- a : 显示所有文件系统的磁盘使用情况
- h : 以友好直观方式显示信息,即以KB或MB为单位
- T : 显示文件系统类型
例子:以友好直观方式显示所有文件系统的使用情况,并列出文件系统类型
df -ahT
du
统计目录或文件所占磁盘空间大小
du [选项/参数] [目录名…]
- a : 递归显示制定目录中各个文件及下级目录中各文件占用的数据块数
- h : 以友好直观方式显示信息,即以KB或MB为单位
- b : 以字节为单位列出磁盘空间使用情况
- k : 以KB为单位显示
- s : 对每个目录参数只给出占用的数据块总数
例子:以KB为单位,显示/tmp目录占用的磁盘空间情况
du -k /tmp
账号管理和查看命令
- whoami命令的功能在于显示用户自身的用户名。
- who [选项]:该命令主要用于查看当前在线的用户情况
-H:显示时加上头标志 - w命令 :用于显示登录到系统的用户情况,是who的增强版 w | more
- id [选项] : 显示用户信息
-g:显示工作组信息
-u:显示用户信息 - finger命令:可用于查找和显示用户信息,并且在查找后显示指定账号的相关信息
- chfn命令:能够改变系统存储的用户信息
- 切换用户身份:su [用户名]
进程
进程的概念
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性:
- 交互进程:由shell启动的进程。
- 批处理进程:这种进程和终端没有联系,是一个进程序列。
- 守护进程:在后台持续运行的进程。
启动进程/手工启动
- 前台启动:一般地,用户键入一个命令,就已经启动了一个前台的进程。
中断前台进程
ctrl+c/
kill - 后台启动:对于非常耗时进程,可以让进程在后台运行。从后台启动进程其实就是在命令结尾加上一个“&”号,例:updaedb &
- jobs 显示所有后台进程
- ctrl+z 前台->后台,并暂停
- fg 将后台进程调到前台执行
- bg 将一个后台暂停的进程,继续执行
at
指定在将来的某个时间点执行某些命令,通过atd守护进程来实现
systemctl status atd
at [选项] TIME
at -l / atq #列出所有的作业
at -d / atrm 任务号 #删除作业
at -q #指定队列来存储(默认为a队列),队列的编号为a-z A-Z,共52个,字母越大,优先级越低。
执行方式:
-
交互式
在shell提示符下输入“at 时间”,然后按回车键。这时在下一行shell会等待用户继续输入要执行的命令。每一行输入一个命令,所有命令都输入完毕后按Ctrl+d键结束。 -
指定文件
将各个命令写入shell脚本中,然后使用下面格式设置在指定时间执行shell脚本中的命令:
at 时间 -f 脚本文件。
执行结果会发邮件通知
/var/spool/mail/xxx
时间格式
- 具体时间日期 hh:mm MM/DD/YY
23:59 03/15/2017 - 模糊词语格式 hh:mm midnight tomorrow am…
17:20 tomorrow - 相对计时法 时间点 + 多少 + 时间单位
now + 2 minutes
5pm + 3 days
cron
at命令产生的进程调度不具有周期性,只能在时间条件满足时执行一次。但很多时候需要重复地周期性地执行某个程序。crontab用来让使用者在固定时间或固定时间间隔执行程序。
格式:
crontab [ -u user ] 文件
crontab [ -u user ] { -l | -r | -e }
只有root用户可以指定他人的时间表
主要参数
- e:执行文字编辑器来设定时程表,内定的文字编辑器是vi
- r:删除目前的时程表
- l:列出目前的时程表
和at命令相比,crontab命令适合完成固定周期的任务
原理
- cron命令在系统启动时由一个shell脚本自动启动,进入后台,crond守护进程。
- cron启动后搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将载入内存。
- 如果没有crontab文件,就转入“休眠”状态,释放系统资源。
- cron每分钟“醒”过来一次,查看当前是否有需要运行的命令。
- 如果发现某个用户设置了crontab文件,它将以该用户的身份去运行文件中指定的命令。命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者/etc/crontab文件中MAILTO环境变量中指定的用户。
对用户来说,只需要关注自己的crontab文件的撰写,不需干涉crond进程的执行。因为一个用户只有一个crontab文件,crontab文件不能直接创建或者直接修改,必须通过crontab命令得到。crontab命令用于安装、删除或者列出用于驱动cron后台进程的crontab文件 。
crontab源文件格式
<minute> <hour> <day-of-month> <month-of-year> <day-of-week> <commands>
- f1: 分钟,00-59
- f2: 小时,00-23
- f3: 一个月份中的第几天,01-31
- f4: 月份,01-12
- f5: 一个星期中的第几天,0-6
- commands: 要执行的程序
# 每月每天12点执行一次echo hello
0 12 * * * echo hello
# 在12月内,每天早上6点到12点,每隔20分钟执行一次/usr/bin/backup
*/20 6-12 * 12 * /usr/bin/backup
# 每月每天的午夜0点20分,2点20分,4点20分…显示当前时间
20 0-23/2 * * * date
进程管理
ps
进程查看命令
ps [选项]
主要选项的含义如下:
- e:显示所有进程;
- f : 采用全格式显示;
- h:不显示标题;
- l:采用详细的格式来显示进程;
- a:显示所有终端上的进程,包括其他用户的进程;
- r:只显示当前终端上正在运行的进程;
- x:显示所有进程,不以终端来区分;
- u:以用户为主的格式来显示进程;
pstree
进程查看命令
pstree [选项] [pid | user]
主要选项的含义如下:
- a:显示该进程的完整指令及参数;
- p : 显示是将PID号一起显示;
- pid:指定显示某进程信息;
- user:指定显示某用户信息;
kill
删除进程命令
kill [-s <信号> | -p ] [ -a ] <进程号> ..
kill -l [信号] :显示信号详情
选项的含义如下:
- s:指定需要送出的信号。既可以是信号名也可以是信号名对应的数字。
- HUP(1):重跑 kill -1
- KILL(9):强制杀死 kill -9
- TERM(15) (预设信号):结束 kill -15
强行中止(经常使用杀掉)一个进程标识号为324的进程:kill -9 324
作用:
- 解除Linux系统的死锁
- 使用命令回收内存
killall
Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:
killall -HUP inetd
top
系统监控命令:能显示实时的进程列表,而且还能实时监视系统资源,包括内存、交换分区和CPU的使用率等。
top命令使用过程中,可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。
- <空格>:立刻刷新。
- P:根据CPU使用大小进行排序。
- M:根据使用内存大小进行排序。
- T:根据时间、累计时间排序。
- t:切换显示进程和CPU状态信息。
- m:切换显示内存信息。
- c:切换显示命令名称和完整命令行。
- q:退出top命令。
free
查看系统内存的使用情况
日志查看
日志文件(log files)是包含关于系统消息的文件,包括内核、服务、在系统上运行的应用程序等。
不同的日志文件记载不同的信息。
多数的日志文件位于/var/log目录下。
某些程序(如samba)在/var/log中有单独的日志文件目录。
日志可以滚动
多数日志文件都使用纯文本格式,可以使用任何文本编辑器如vi来查看它们。
大多数日志文件都需要拥有特权才允许查看。
系统初始化过程
BIOS初始化
主要负责计算机硬件检测,确定启动引导顺序,并从可引导设备中加载和执行引导程序(如磁盘主引导分区MBR) ,确定从哪里可以引导并启动操作系统,引导成功后,交由内核负责
GRUB加载
Boot Loader(启动加载)管理程序
将引导装载程序安装到主引导记录(MBR)的程序
用户能够开始操作系统的选择,在内核引导时传递特定指令给内核,或是在内核引导前确定一些系统参数。
支持命令交互工具,提供非常方便的引导程序修复功能,并支持引导菜单的加密保护
内核初始化
用户在GRUB引导菜单中选择了合适的启动项后,操作系统正式进入加载内核的功能。
内核初始化:
- 硬件设备的检测
- 设备驱动程序的初始化
- 以只读方式挂载根文件系统
- 启动第一个应用进程init
第一个初始进程init启动
当内核启动之后,通过启动用户级程序init来完成引导进程的内核部分。
init总是第一个进程(PID=1)
init进程扮演了终极父进程的角色,失去了父进程的子进程就会以init作为它们的父进程。
确定系统运行级别
读取配置文件/etc/inittab,这是一个系统初始化脚本程序,用于确定系统启动的运行级别,定义系统常规功能。
运行系统初始化脚本
/etc/rc.d/rc.sysinit 是系统的初始化脚本,系统的大部分功能都由这个脚本实现
运行指定级别目录内的脚本
每一个特定的运行级别都会有一个与之相对应的目录,共有7个运行界别(/etc/rc.d/rc[x].d),每一个运行级别的目录内都有一些可执行脚本。
运行用户自定义脚本
用户可以自定义一些系统启动时启动的脚本,通过修改/etc/rc.d/rc.local的内容来增加用户自己需要的功能。