linux 学习笔记
文章目录
磁盘分区
1. MBR
Master Boot Record,主引导记录
第一扇区是主要扇区,此扇区通常有 512 B大小,记录:
-
主引导记录(master boot record)
安装启动引导程序的地方,有 446 B
-
启动引导程序
-
加载操作系统内核文件
-
操作系统安装在 MBR 上的一个软件
-
多操作系统时提供选项选择启动哪个系统
转交其他引导程序引导,其他引导程序安装在相应分区的启动扇区上
-
-
-
分区表(portion table)
记录整块硬盘分区状态,有 64 B
-
只能记录四组分区
每组分区大小为 16 B
-
主要分区(Primary)
实际记录数据的分区,可格式化。
-
扩展分区(Extended):最多只能有一个
使用额外扇区记录分区信息,不能格式化。
可再分区,称逻辑分区。
-
逻辑分区(Logical)
和主要分区差不多。
设备号码从 5号(/dev/sda5)开始,因为前四个号码分给主要分区和扩展分区
-
-
-
每组记录该分区开始和结束柱面号码
-
分区的最小单位为一个柱面。
分区只对分区表进行设置。
系统写入磁盘时先参考分区表,再针对某个分区进行数据处理。
每个分区都会有自己启动扇区(boot sector)。
无法使用 2.2 TB 以上的硬盘
2. GPT
GUID partition table
扇区为逻辑区块,每个区块对应一个逻辑区块地址(Logical Block Address)。
扇区大小不止 512 B。
前 34 个 LBA 记录分区信息,后 34 个 LBA 为分区信息的备份:
-
LBA0( MBR 兼容区块)
- 446 B 区块:存储第一阶段的启动引导程序
- 分区表:仅存储一个特殊标志符,表示磁盘为 GPT 格式之意,不支持 GPT 分区的磁盘管理程序不会识别
-
LBA1( GPT 表头记录)
记录一下内容:-
分区表的位置与大小
-
备份的 GPT 分区的位置
-
分区表的校验码( CRC32)
操作系统通过此校验码判断 GPT 是否正确,若错误则从备份 GPT 恢复
-
-
LBA2-33(实际记录分区信息处)
-
每个 LBA 记录 4 组分区记录
默认情况下共可以有 4 × \times × 32 = 128 组分区记录。
每组记录提供 64 b 记录开始/结束的扇区号码,因此单一分区最大容量为 2 64 × 512 B = 8 Z B 2^{64} \times 512 B = 8 ZB 264×512B=8ZB。
-
3. 分区的意义
-
数据安全性
例如 windows 系统重装时只影响 C 盘,对其他盘无影响
-
提高系统性能
若磁盘的的一个分区的分区范围为 1~100 柱面,则读取时只在该范围内读取,数据集中
BIOS 与 UEFI
1. BIOS
Basic Input Output System,基本输入输出系统
BIOS芯片:是特指存储 BIOS 程序的一块特定的 ROM 储存器,是主板上一颗小小的快闪 EEPROM 内存模块板中的长方形或正方形芯片,这一类芯片可以存储 BIOS 程序,也可以存储其它程序、代码。
CMOS芯片:是记录各项硬件参数且嵌入在主板上面的 RAM 储存器,里面的数据是从 BIOS 芯片中读入,由主板电池供电。也就是说 BIOS 里放的是安全参数(可以使电脑正常开机的参数),不可更改。而 CMOS 里放的是用户自己设置的参数,方便用户进行超频之类的操作
写入主板的一个软件。
开机时第一个运行的程序。
引导操作系统启动。
到硬盘里读取第一扇区的 MBR 位置,运行里面的启动引导程序。
2. UEFI
Unified extensible Firmware Interface,统一可扩展固件接口
基础固件烧制在主板存储区中,然后在磁盘上创建 EFI 系统分区来存储更多的内容和数据。
-
EFI 系统分区
操作系统的 bootlloader 是存放在主引导记录(MBR)中的,容量受限,所以 UEFI 中引入了一个新的系统分区 ESP (EFI System Partition) ,该分区用来存储操作系统的 bootloader 和 EFI 驱动程序等数据,当计算机启动后,UEFI 固件从该分区中加载所需要的硬件驱动,执行 bootloader 启动指定的操作系统。
3. BIOS 与 UEFI 对比
比较项目 | 传统 BIOS | UEFI |
---|---|---|
编写语言 | 汇编语言 | C 语言 |
硬件资源控制 |
使用中断(IRQ)管理 不可变内存存取 不可变输入输出存取 |
使用驱动程序与协议 |
处理器运行环境 | 16 位 | CPU 保护模式 |
扩充方式 | 通过 IRQ 连接 | 直接加载驱动程序 |
第三方厂商支持 | 较差 | 较佳且支持多平台 |
图形能力 | 较差 | 较佳 |
内置简化操作系统环境 | 不支持 | 支持 |
Linux 目录结构
所有文件都是由根目录(/)衍生而来:
1. bin
Linux 命令汇总
日期命令
计算器
-
计算器,binary calculator
在线求助
-
查看手册,manual
例:
man date DATE(1) User Commands DATE(1) NAME date - print or set the system date and time SYNOPSIS date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] DESCRIPTION Display the current time in the given FORMAT, or set the system date. Mandatory arguments to long options are mandatory for short options too. -d, --date=STRING display time described by STRING, not 'now' -f, --file=DATEFILE like --date once for each line of DATEFILE -I[TIMESPEC], --iso-8601[=TIMESPEC] output date/time in ISO 8601 format. TIMESPEC='date' for date only (the default), 'hours', 'minutes', 'seconds', or 'ns' for date and time to the indicated precision. -r, --reference=FILE display the last modification time of FILE Manual page date(1) line 1 (press h for help or q to quit)
数字:
代号 | 代表内容 |
---|---|
1 | 用户在 shell 环境中可操作的命令或可执行文件 |
2 | 系统内核可调用函数与工具 |
3 | 一些常用函数(function)与函数库(library),大部分为 C 函数库(libc) |
4 | 设备文件说明,通常在 /dev 下的文件 |
5 | 配置文件或某些文件格式 |
6 | 游戏 |
7 | 惯例与协议等 |
8 | 系统管理员 root 可用的管理命令 |
9 | 跟内核有关的文件 |
大写单词:
代号 | 内容说明 |
---|---|
NAME | 简短的命令、数据名称说明 |
SYNOPSIS | 简短的命令语法(syntax)简介 |
DESCRIPTION | 较为完整的说明 |
OPTIONS | 针对 SYNOPSIS 部分中,有列举的所有可用的选项说明 |
COMMANDS | 当程序执行的时候,可在此程序执行的命令 |
FILES | 这个程序或数据所使用或参考或链接到的某些文件 |
SEE ALSO | 可以参考跟这个命令或数据有关的其他说明 |
EXAMPLE | 一些可以参考的范例 |
-
查看手册,information
关机重启
关机命令
重启命令
数据同步写入磁盘,synchronize
关机命令
关机命令
休眠命令
文件管理
观察文件类型
文件默认权限,user mask
修改文件隐藏属性,change attribute
显示文件隐藏属性,list attribute
修改文件时间或创建文件
chgrp
修改文件用户组,change group
chown
修改文件所有者,change owner
chmod
修改文件权限,change mode
目录管理
切换目录,change directory
打印当前工作目录,print working directory
建立新目录,make directory
删除空目录,remove directory
文件与目录管理
列出文件和目录,list
复制文件或目录,copy
删除文件或目录,remove
移动文件或目录,move
获取文件名与路径
获取文件名
获取文件路径
文件内容查看
从第一行查看,concatenate
从最后一行查看,tail concatenate
显示行号查看 number lines
一页一页查看
与more类似,可往前翻页
只查看前几行
只查看后几行
二进制方式查看,ordinary
- zcat
压缩文件查看,与 cat 类似 - zmore
压缩文件查看,与 more 类似 - zless
压缩文件查看,与 less 类似
查找命令
根据 PATH 环境变量查找
只查找特定目录的文件
通过已建立数据库 /var/lib/mlocate 查找
- updatedb
更新数据库文件
磁盘查找
操作文件系统
容量查看
-
df
查看文件系统的整体使用量
例:
[root@study ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 devtmpfs 1928184 0 1928184 0% /dev tmpfs 1939972 0 1939972 0% /dev/shm tmpfs 1939972 8812 1931160 1% /run tmpfs 1939972 0 1939972 0% /sys/fs/cgroup /dev/mapper/centos-root 10475520 1752912 8722608 17% / /dev/sda2 1038336 153100 885236 15% /boot /dev/mapper/centos-home 10475520 33072 10442448 1% /home tmpfs 387996 0 387996 0% /run/user/0
-
du
查看目录使用量
例:[root@study ~]# du -a 4 ./.bash_logout 4 ./.bash_profile 4 ./.bashrc 4 ./.cshrc 4 ./.tcshrc 4 ./anaconda-ks.cfg 12 ./.bash_history 4 ./.lesshst 4 ./.ssh/id_rsa 4 ./.ssh/id_rsa.pub 4 ./.ssh/known_hosts 12 ./.ssh 4 ./.viminfo 56 .
默认大小为 1 KB
链接文件
ln
,link
-
硬链接
文件名指向目标文件的 inode
例:
[root@study test]# touch source.txt [root@study test]# ll 总用量 0 -rw-r--r--. 1 root root 0 8月 22 12:12 source.txt [root@study test]# ln source.txt ./hardln.txt [root@study test]# ll 总用量 0 -rw-r--r--. 2 root root 0 8月 22 12:12 hardln.txt -rw-r--r--. 2 root root 0 8月 22 12:12 source.txt
优点:
- 安全,无论删除哪个文件另一个文件都可以正常使用
- 同步,无论编辑哪个文件,另一个文件也会修改
缺点:
- 不能跨文件系统
- 不能链接目录
-
符号链接
新分配一个 inode 和 block,文件名指向 inode,inode 指向 block,block 内存储目标文件的路径
例:[root@study test]# ll 总用量 0 -rw-r--r--. 1 root root 0 8月 22 12:12 source.txt [root@study test]# ln -s source.txt ./signln.txt [root@study test]# ll 总用量 0 lrwxrwxrwx. 1 root root 10 8月 22 15:16 signln.txt -> source.txt -rw-r--r--. 1 root root 0 8月 22 12:12 source.txt
检验修复
-
xfs_repair
处理 XFS 文件系统XFS 文件系统发生故障时才使用,慎用!!!
-
fsck.ext4
处理 ext4 文件系统
挂载与卸载
-
mount
挂载
挂载:利用一个目录当进入点,将磁盘分区的数据放在该目录下;进入该目录就是读取该分区挂载时,系统会自动识别文件系统类别,会参考以下文件:
-
/etc/filesystems
系统指定测试挂载文件系统的优先级[root@study test]# cat /etc/filesystems xfs ext4 ext3 ext2 nodev proc nodev devpts iso9660 vfat hfs hfsplus *
-
/proc/filesystems
系统已经加载的文件系统类型[root@study test]# cat /proc/filesystems nodev sysfs nodev rootfs nodev ramfs nodev bdev nodev proc ···
-
/lib/modules/$(uname -r)/kernel/fs
保存文件系统的驱动的目录
[root@study test]# ls /lib/modules/$(uname -r)/kernel/fs binfmt_misc.ko.xz ceph dlm fat gfs2 lockd nfs_common overlayfs udf btrfs cifs exofs fscache isofs mbcache.ko.xz nfsd pstore xfs cachefiles cramfs ext4 fuse jbd2 nfs nls squashfs
设置启动挂载时只需修改 /etc/fstab 文件即可,该文件内容解析:
[root@study ~]# cat /etc/fstab # /etc/fstab # Created by anaconda on Mon Jul 11 16:32:40 2022 # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info /dev/mapper/centos-root / xfs defaults 0 0 UUID=46e9cb70-2af6-4299-b0d9-8bc44aee96d1 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
-
第一栏:磁盘设备文件名/UUID/Label
-
第二栏:挂载点
-
第三栏:磁盘分区的文件系统
-
第四栏:文件系统参数
参数 意义 async/sync
异步/同步设置磁盘是以异步还是同步方式运行,默认为 async auto/noauto
自动/非自动当执行 mount -a
时,该文件系统是否会被主动测试挂载,默认为 autorw/ro
可擦写/只读默认为 rw exec/noexec
可执行/不可执行设置文件系统内的文件是否可以执行,默认为 exec user/nouser 设置是否允许用户使用 mount
命令挂载,user 为允许的用户,nouser 为不允许的用户,默认为所有人均可挂载suid/nosuid 该文件系统是否允许 SUID 权限的存在,默认为 suid default 默认 -
第五栏:能否被
dump
备份命令作用 -
第六栏:是否以
fsck
检验扇区
特殊设备 loop 挂载:
mount -o loop ···
注意事项:
-
一个文件系统不应挂载在多个目录上
-
一个目录不应挂载多个文件系统
-
作为挂载点的目录应为空目录若目录为非空,则目录的内容就会暂时消失
-
挂载的不一定是文件系统,还可是目录
-
-
umount
卸载
注意事项:- 卸载时必须先将工作目录移至挂载目录外
修改参数
- xfs_admin
修改 XFS 文件系统的 UUID 与 Lable
备份与还原
- xfsdump
XFS 文件系统备份 - xfsrestore
XFS 文件系统还原 - cpio
操作磁盘
观察磁盘状态
-
lsblk
列出系统上所有磁盘列表,list block
例:[root@study test]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 1G 0 part /boot ├─sda3 8:3 0 28G 0 part │ ├─centos-root 253:0 0 10G 0 lvm / │ ├─centos-swap 253:1 0 1G 0 lvm [SWAP] │ └─centos-home 253:2 0 10G 0 lvm /home ├─sda4 8:4 0 1G 0 part └─sda5 8:5 0 1G 0 part sr0 11:0 1 60.9M 0 rom
-
MAJ:MIN:主要与次要设备代码,内核识别设备根据这两个代码识别
-
RM:是否为可卸载设备(removable device),1 是 0 不是
-
RO:是否为只读设备
-
TYPE
TYPE 值 意义 disk 磁盘 partition 分区 rom 只读存储器
-
-
blkid
列出磁盘设备的 UUID 等参数,block id[root@study test]# blkid /dev/sda2: UUID="46e9cb70-2af6-4299-b0d9-8bc44aee96d1" TYPE="xfs" PARTUUID="55a10ac6-00d0-4771-ace7-d6ba3b6672ff" /dev/sda3: UUID="idolca-e6ZO-wmUx-T8eg-TeLP-dcQn-2vtNMy" TYPE="LVM2_member" PARTUUID="051c8b7d-cb20-4899-811b-5fd7f333e76f" /dev/sda4: UUID="8e1aaf51-0e71-46a6-aa16-02bc3e3cff78" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="02465423-2c80-47a4-aff4-aba1eb42e52d" /dev/sr0: UUID="2022-07-19-21-57-51-86" LABEL="VBox_GAs_6.1.36" TYPE="iso9660" /dev/mapper/centos-root: UUID="7aa5fd85-0d7e-4bd7-900e-4f588976dcb4" TYPE="xfs" /dev/mapper/centos-swap: UUID="0af64196-e619-43a0-9393-a686b27451cd" TYPE="swap" /dev/mapper/centos-home: UUID="2777df42-6bf0-4448-92d0-448d00870f59" TYPE="xfs" /dev/sda1: PARTUUID="63c77965-6777-4f1f-b1a1-6b3be2330d32" /dev/sda5: PARTLABEL="Microsoft basic data" PARTUUID="f49954a1-6927-43d8-95e8-00d224bafb9b"
磁盘分区
-
gdisk
GPT 分区表专用分区命令
例:
[root@study test]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 1G 0 part /boot ├─sda3 8:3 0 28G 0 part │ ├─centos-root 253:0 0 10G 0 lvm / │ ├─centos-swap 253:1 0 1G 0 lvm [SWAP] │ └─centos-home 253:2 0 10G 0 lvm /home ├─sda4 8:4 0 1G 0 part └─sda5 8:5 0 1G 0 part sr0 11:0 1 60.9M 0 rom [root@study test]# parted /dev/sda print Model: ATA VBOX HARDDISK (scsi) Disk /dev/sda: 42.9GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: pmbr_boot Number Start End Size File system Name 标志 1 1049kB 3146kB 2097kB bios_grub 2 3146kB 1077MB 1074MB xfs 3 1077MB 31.1GB 30.0GB lvm 4 31.1GB 32.2GB 1074MB xfs Linux filesystem 5 32.2GB 33.2GB 1074MB Microsoft basic data [root@study test]# gdisk /dev/sda GPT fdisk (gdisk) version 0.8.10 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help):
-
fdisk
MBR 分区表专用分区命令 -
parted
GPT/MBR 分区表都可用的分区命令
!注意:磁盘分区完后若不重启则可用 partprobe
命令更行内核
磁盘格式化
mkfs
,make filesystem
- mkfs.xfs
格式化为 XFS 文件系统 - mkfs.ext4
格式化为 ext4 文件系统
创建交换分区
当内存不够用时,系统就会将暂不使用的程序与数据放到交换分区中
步骤:
使用物理分区:
-
分区
GPT 分区表用 gdisk,MBR 分区表用 fdisk[root@study ~]# gdisk /dev/sda GPT fdisk (gdisk) version 0.8.10 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): n Partition number (6-128, default 6): First sector (34-83886046, default = 64903168) or { +-}size{ KMGTP}: Last sector (64903168-83886046, default = 83886046) or { +-}size{ KMGTP}: +512M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): 8200 Changed type of partition to 'Linux swap' Command (? for help): p Disk /dev/sda: 83886080 sectors, 40.0 GiB Logical sector size: 512 bytes Disk identifier (GUID): C534C26E-99EF-4FB9-9E22-547AE60FDD93 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 83886046 Partitions will be aligned on 2048-sector boundaries Total free space is 17936317 sectors (8.6 GiB) Number Start (sector) End (sector) Size Code Name 1 2048 6143 2.0 MiB EF02 2 6144 2103295 1024.0 MiB 0700 3 2103296 60708863 27.9 GiB 8E00 4 60708864 62806015 1024.0 MiB 8300 Linux filesystem 5 62806016 64903167 1024.0 MiB 0700 Microsoft basic data 6 64903168 65951743 512.0 MiB 8200 Linux swap Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/sda. Warning: The kernel is still using the old partition table. The new table will be used at the next reboot. The operation has completed successfully. [root@study ~]# partprobe Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。 [root@study ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 2M 0 part ├─sda2 8:2 0 1G 0 part /boot ├─sda3 8:3 0 28G 0 part │ ├─centos-root 253:0 0 10G 0 lvm / │ ├─centos-swap 253:1 0 1G 0 lvm [SWAP] │ └─centos-home 253:2 0 10G 0 lvm /home ├─sda4 8:4 0 1G 0 part ├─sda5 8:5 0 1G 0 part └─sda6 8:6 0 512M 0 part sr0 11:0 1 60.9M 0 rom
-
格式化为 swap 格式
[root@study ~]# mkswap /dev/sda6 正在设置交换空间版本 1,大小 = 524284 KiB 无标签,UUID=61fc6954-a93a-437d-9dc5-09ba1aac183b [root@study ~]# blkid /dev/sda6 /dev/sda6: UUID="61fc6954-a93a-437d-9dc5-09ba1aac183b" TYPE="swap" PARTLABEL="Linux swap" PARTUUID="8e051b8c-feec-43c6-8fc1-5389b8b36af7"
-
加载
[root@study ~]# free #查看内存使用情况 total used free shared buff/cache available Mem: 3879960 229720 3500316 8816 149924 3452724 Swap: 1048572 0 1048572 [root@study ~]# swapon /dev/sda6 #增加swap分区 [root@study ~]# free total used free shared buff/cache available Mem: 3879960 229432 3500556 8816 149972 3452988 Swap: 1572856 0 1572856 [root@study ~]# swapon -s 文件名 类型 大小 已用 权限 /dev/dm-1 partition 1048572 0 -2 /dev/sda6 partition 524284 0 -3
使用文件:
-
创建大文件
[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128 记录了128+0 的读入 记录了128+0 的写出 134217728字节(134 MB)已复制,0.0673783 秒,2.0 GB/秒 [root@study ~]# ll -h /tmp/swap -rw-r--r--. 1 root root 128M 8月 25 19:10 /tmp/swap
-
格式化为 swap 格式
[root@study ~]# mkswap /tmp/s swap systemd-private-981518e54e9c4991b5ffadf4a5c1fe12-chronyd.service-Q7OMKz/ [root@study ~]# mkswap /tmp/swap 正在设置交换空间版本 1,大小 = 131068 KiB 无标签,UUID=88beb937-2e43-4ae6-92a4-331646f54abe
-
加载
[root@study ~]# free total used free shared buff/cache available Mem: 3879960 229216 3365976 8816 284768 3429376 Swap: 1572856 0 1572856 [root@study ~]# swapon /tmp/swap swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。 [root@study ~]# free total used free shared buff/cache available Mem: 3879960 229776 3365416 8816 284768 3428816 Swap: 1703924 0 1703924 [root@study ~]# swapon -s 文件名 类型 大小 已用 权限 /dev/dm-1 partition 1048572 0 -2 /dev/sda6 partition 524284 0 -3 /tmp/swap file 131068 0 -4
关闭交换分区
[root@study ~]# swapoff /tmp/swap /dev/sda6
[root@study ~]# swapon -s
文件名 类型 大小 已用 权限
/dev/dm-1 partition 1048572 0 -2
创建设备文件
- mknod
压缩
作用:将文件缩小,便于传输
几种常见压缩文件扩展名:
扩展名 | 压缩文件类型 |
---|---|
*.z | compress 程序压缩文件 |
*.zip | zip 程序压缩文件 |
*.gz | gzip 程序压缩文件 |
*.bz2 | bzip2 程序压缩文件 |
*.xz | xz 程序压缩文件 |
*.tar | tar 程序打包文件,并未压缩 |
*.tar.gz | tar 程序打包,再经 gzip 程序压缩 |
-
gzip
为替换 compress 而生,应用最广,可解压缩 compress、zip、gzip 等软件的压缩文件!注:默认情况下经过 gzip 压缩后源文件就不存在了,只有压缩文件
-
bzip2
为替换 gzip 而生,压缩比更好 -
xz
压缩比比 bzip2 更高 -
tar
gzip/bzip2/xz不能对目录进行压缩,只能递归压缩目录下的每个文件
若要压缩目录,要先用 tar 命令对目录进行打包成大文件后再压缩
文本编辑
选取
-
cut
将数据分割成几段[root@study ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@study ~]# echo $PATH | cut -d':' -f 2 /usr/local/bin [root@study ~]# echo $PATH | cut -d ':' -f 3,4 /usr/sbin:/usr/bin
-
grep
查找某个字符
[root@study ~]# ls | grep "an" anaconda-ks.cfg anaconda-ks.cfg.cp
排序
- sort
- uniq
对结果重复数据仅列出一个
统计
- wc
Linux 文件属性
权限:
- r(read):4
- 文件:可读取文件内容
- 目录:可读取目录中的文件名
- w(write):2
- 文件:可修改文件内容
- 目录:可在目录中创建删除文件
- x(execute):1
- 文件:文件可执行
- 目录:可进入目录
- SUID(Set UID):4
- 二进制程序有效
- 具有 x 权限
- 执行过程中具有文件所有者权限
- GUID(Set GID):2
- 二进制程序或者目录有效
- 具有 x 权限,目录还需具有 r 权限
- 可执行文件时执行过程中具有文件所属组权限
- 目录时用户在该目录下的有效用户组将变成该目录所数组
- SBIT(Sticky Bit):1
- 目录有效
- 具有 w、x 权限
- 用户在该目录下建立的文件或目录只有自己和 root 能删除
时间:
-
修改时间(modification time,mtime)
文件内容数据更改时更改
-
状态时间(status time,ctime)
文件权限或属性更改时更改
-
访问时间(access time,atime)
文件内容被读取时更改
Linux 文件系统
ext2
命令:
dumpe2fs
例:
1. 数据区块(data block)
存放文件数据的地方
Block 大小 | 1 KB | 2 KB | 4 KB |
---|---|---|---|
最大单一文件限制 | 16 GB | 256 GB | 2 TB |
最大文件系统总容量 | 2 TB | 8 TB | 16 TB |
- 大小与数量在格式化完后不能更改
- 每个区块最多只能放置一个文件数据
- 一个文件可占用多个区块
- 即使一个文件未占满一个区块,该区块也不能再被使用了
2. inode(index node table)
存放**文件属性以及此文件所在的区块号**
- inode 大小与数量在格式化完后不能更改
- 每个 inode 大小为 128 B(ext4 与 xfs 可设置到 256 B)
- 每个文件只占用一个 inode
- 系统读取文件时先找到 inode 查看用户是否有权限,若有才能读取文件内容
- 用 4 B 记录一个数据区块
- 可用
stat
命令查看
指向区块:
-
12 个直接指向
直接指向数据区块
-
1 个间接指向
指向的数据区块记录存储文件数据的数据区块
-
1 个双间接指向
-
1 个三间接指向
3. 超级区块(super block)
记录整个文件系统相关信息
- 数据区块与 inode 的总量
- 未使用与已使用的 inode 与数据区块数量
- 数据区块与 inode 的大小(block 为 1、2、4 K,inode 为 128 B 或 256 B)
- 文件系统的挂载时间、最近一次写入时间、最近一次检验磁盘(fdisk)时间等文件系统相关信息
- 一个有效位。若此文件系统已被挂载则为 0,否则为 1
- 用
dumpe2fs
命令查看 - 一般大小为 1024 B
- 一个文件系统只有一个超级区块,但可能有多个备份
4. 文件系统描述说明(filesystem description)
- 记录每个区块群组的开始与结束的区块
- 每个区段(超级区块、对照表、inode 对照表、数据区块)分别位于哪个区块之间
- 可用
dumpe2fs
命令查看
5. 区块对照表(block bitmap)
记录每个数据区块的使用情况
6. inode 对照表(inode bitmap)
记录每个 inode 的使用情况
ext2 下的文件与目录
1. 目录
- 新建目录时文件系统会分配一个 inode 与至少一个 block 给该目录
- inode 记录目录属性,并不记录目录名
- block 记录目录下的文件名与该文件所指向的 inode
2. 文件
- 新建文件时文件系统会分配一个 inode 与至少能装下文件数据的 block 数量
- inode 记录文件属性,并不记录文件名
- block 记录文件数据
XFS
命令:
xfs_info
例:
[root@study ~]# df -T /boot
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/sda2 xfs 1038336 153100 885236 15% /boot
[root@study ~]# xfs_info /dev/sda2
meta-data=/dev/sda2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
- 第一行:
- isize:inode 的容量为 512 B
- agcount:存储区群组的个数为 4 个
- agsize:每个存储区群组具有 65536 个区块
- 第二行:
- sectsz:逻辑扇区(sector)的容量为 512 B
- 第四行:
- bsize:数据区块的容量为 4096 B
- blocks:共有 262144 个数据区块
- 第七行:
- internal:登录区的位置在文件系统内,而非其他外部设备
1. 数据区(data section)
存放 inode、数据区块、超级区块等数据
与 ext 的区块群组类似,XFS 也分为多个存储区群组(allocation group),包含:
- 整个文件系统的超级区块
- 剩余空间管理机制
- inode 的分配与追踪
与 ext 文件系统的差异:
- inode 与数据区块都是动态分配产生的,因此格式化快
- inode 与数据区块有多种不同容量供设置:
- 数据区块:512 B ~ 64 KB
- inode:256 B ~ 2 MB
2. 文件系统活动登录区(log section)
记录文件系统的变化,类似日志区:
- 当文件系统损坏时,系统会拿此区域检验
- 此区域磁盘活动频繁,可以指定别的更快的磁盘作为登录区
3. 实时运行区(realtime section)
当建立新文件时,xfs 会在这个区找一个到数个的 extent 区块,将文件放置在找到的 extent 区块,等分配完后再写入到数据区的 inode 和数据区块中:
- extent 区块大小在格式化时就已经指定:4 KB ~ 1 GB
各文件系统对比
文件系统 | 优点 | 缺点 |
---|---|---|
ext | 支持度广 | 格式化慢 (预先全局规划出所有的 inode、block等) |
XFS | 格式化快、适合高容量磁盘和巨型文件 (动态分配) |
支持度相对 ext 较差 |
Linux 内核
VFS
Virtual Filesystem Switch
对 Linux 的文件系统进行管理,自动识别和读取文件系统
- 传统文件系统:ext2、minix、FAT、iso9660 等
- 日志式文件系统:ext3、ext4、ReiserFS、Windows’ NTFS、IBM’s JFS、SGI’s XFS、ZFS 等
- 网络文件系统:NFS、SMBFS 等
查看我的 Linux 发行版支持的文件系统:
❯ ls -l /lib/modules/$(uname -r)/kernel/fs
总计 216
···
drwxr-xr-x 2 root root 4096 8月18日 23:39 ext4
drwxr-xr-x 2 root root 4096 8月18日 23:39 minix
drwxr-xr-x 5 root root 4096 8月18日 23:39 nfs
···
查看系统目前已加载到内存中支持的文件系统:
❯ cat /proc/filesystems
···
ext3
ext2
ext4
fuseblk
nodev fuse
nodev fusectl
vfat
Linux 设备
Linux 系统下各硬件设备都是以文件来表示,系统通过文件的 major 和 minor 数值来替代
major 和 minor 值
major 和 minor 值是有特殊意义的,不能随便设置
各硬件设备的文件名
设备 | 文件名 |
---|---|
SCSI、SATA、USB磁盘驱动器,U盘 | /dev/sd[a-p] |
Virtio接口(用于虚拟机) | /dev/vd[a-p] |
软盘驱动器 | /dev/fd[0-7] |
打印机 | /dev/lp[0-2](25针打印机) /dev/usb/lp[0-15](USB接口) |
鼠标 |
/dev/input/mouse[0-15](通用) /dev/psaux(PS/2接口) /dev/mouse(当前鼠标) |
CD-ROM DVD-ROM |
/dev/scd[0-1](通用) /dev/sr[0-1](通用,CentOS 较常见) /dev/cdrom(当前 CD-ROM) |
磁带机 | /dev/ht0(IDE接口) /dev/st0(SATA/SCSI 接口) /dev/tape(当前磁带) |
IDE 磁盘驱动器 | /dev/hd[a-d](旧系统) |
- 磁盘命名方式只与 Linux 内核检测顺序有关,与实际插槽无关
例如:若主板有六个SATA插槽,只有一插槽和五插槽插有磁盘,则
SATA1:/dev/sda
SATA5:/dev/sdb
shell
shell 是用于代替用户与系统内核沟通的壳程序
分为图形化shell和命令行shell:
- 图形化shell:KDE、Gnome等桌面应用程序
- 命令行shell:bash、zsh等终端模拟器
又可分为login shell和non-login shell:
- login shell:取得 bash 时需要完整的登录流程,如:tty 登录
- non-login shell:取得 bash 时不需要重复登录操作,如:登录 kde 后从桌面打开 console
查看系统已有的shell
保存在 /etc/shells
文件里
[root@study ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
Bash
Bash 为 Linux 内置默认的 Shell
快捷键
快捷键 | 快捷键说明 |
---|---|
CTRL-A | 将光标移到行首(在命令行下) |
CTRL-B | 退格 (非破坏性的),这个只是将光标位置往回移动一个位置。 |
CTRL-C | 中断,终结一个前台作业。 |
CTRL-D | “EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。 |
CTRL-E | 将光标移动到行尾(在命令行下) |
CTRL-F | 将光标向前移动一个字符(在命令行下) |
CTRL-G | BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。 |
CTRL-H | 擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。 |
CTRL-J | 新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。 |
CTRL-M | 回车(Carriage return)。 |
CTRL-N | 擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。 |
CTRL-O | 产生一个新行(在命令行下)。 |
CTRL-P | 从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。 |
CTRL-Q | Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。 |
CTRL-R | 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。 |
CTRL-S | Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。 |
CTRL-T | 交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。 |
CTRL-U | 擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。 |
CTRL-W | 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。 |
CTRL-Y | 将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。 |
CTRL-Z | 暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。 |
CTRL-/ | 退出。和CTRL-C差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。 |
CTRL-/ | 撤消操作,Undo。 |
CTRL-_ | 撤消操作。 |
CTRL-xx | 在行首和光标两个位置间进行切换,此处是两个”x”字符。 |
内置命令
-
type
查看某命令是否为内置命令[root@study ~]# type cd cd 是 shell 内嵌[root@study ~]# type -a ls ls 是 `ls --color=auto' 的别名ls 是 /usr/bin/ls [root@study ~]# type -t systemctl file
-
read
通过用户输入来设置变量值[root@study ~]# read name wuqin [root@study ~]# echo $name wuqin
-
declare、typeset
声明变量类型[root@study ~]# declare -i sum=100+300+50 [root@study ~]# echo $sum 450 [root@study ~]# typeset -i sum=1+1+2 [root@study ~]# echo $sum 4
-
ulimit
限制用户可使用的系统资源 -
alias
为命令设置别名 -
unalias
取消设置别名
-
hisroty
查看历史命令
注:- 只有用户注消时此次登录所执行的命令才会被更新到文件
~/.bash_history
中 - 多个人同时登陆一个账号时只有最后一个注销的那个人所执行的命令才会被记录下来(因为前面注销的人所执行的命令被覆盖了)
- 只有用户注消时此次登录所执行的命令才会被更新到文件
变量
-
echo
查看变量的值[root@study ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
注:变量名前加
$
符号的意思是取变量值 -
unset
删除变量[root@study ~]# name='wuqin' [root@study ~]# echo $name wuqin [root@study ~]# unset name [root@study ~]# echo
-
变量内容修改
- /:修改第一个匹配项
- //:修改全部匹配项
[root@study ~]# path=${PATH} [root@study ~]# echo $path /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 删除 [root@study ~]# echo ${path/"/usr/local/bin:"/""} /usr/local/sbin:/usr/sbin:/usr/bin:/root/bin # 修改 [root@study ~]# echo ${path/"sbin"/"bin"} /usr/local/bin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@study ~]# echo ${path//"sbin"/"bin"} /usr/local/bin:/usr/local/bin:/usr/bin:/usr/bin:/root/bin
-
变量内容条件修改
表达式 str 没有设置 str 为空 str 已设置且不为空 var=${str-expr} var=“expr” var=“” var=$str var=${str:-expr} var=“expr” var=“expr” var=$str var=${str+expr} var=“” var=“expr” var=“expr” var=${str:+expr} var=“” var=“” var=“expr” var=${str=expr} str=“expr”
var=“expr”str 不变
var=“”str 不变
var=“expr”var=${str:=expr} str=“expr”
var=“expr”str=“expr”
var=“expr”str 不变
var=“expr”var=${str?expr} expr 输出至 stderr var=“” var=$str var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str
环境变量
-
env
查看系统所有的环境变量
[root@study ~]# env XDG_SESSION_ID=2 HOSTNAME=study.centos.vbird <== 主机名 SELINUX_ROLE_REQUESTED= TERM=xterm-256color <== 终端模拟器 SHELL=/bin/bash <== SHELL 软件 ···
-
set
查看所有的环境变量,包括环境变量和用户自定义变量[root@study ~]# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() ···
- PS1:命令提示符,也就是
[root@study ~]#
- \d:可显示
星期 月 日
的形式,如:Mon Feb 2
- \H:完整的主机名,如
study.centos.vbird
- \h:主机名第一个小数点前的字符,如
study
- \t:24 小时格式时间
HH:MM:SS
- \T:12 小时格式时间
HH:MM:SS
- \A:24 小时格式时间,不显示秒
HH:MM
- @:12小时格式时间
HH:MM am/pm
- \u:当前用户名称,如:
root
- \v:BASH 的版本信息
- \w:完整工作目录的名称
- \W:之显示最后一个目录名
- \#:执行的第几个命令
- \KaTeX parse error: Expected 'EOF', got '#' at position 18: …示字符,root 用户时为 `#̲`,其他用户为 ``
- \d:可显示
- $:此 shell 的 PID
- ?:上个命令的返回值
- PS1:命令提示符,也就是
-
export
将变量设置成环境变量
-
stty
终端环境设置
命令查找顺序
- 相对/绝对路径
- alias 别名
- bash 内置命令
- PATH 变量所查找到的命令
登陆欢迎信息
-
文件
/etc/issue
:登陆到 tty 时所提示的信息 -
文件
/etc/issue.net
:通过 telnet 程序连接到主机时所提示的信息-
issue 内各代码含义
代码 含义 \d 本地端时间日期 \l 显示第几个终端界面 \m 显示硬件等级 \n 显示主机网络名称 \O 显示 domain name \r 操作系统版本(相当与 uname -r
)\t 显示本地端时间 \S 操作系统的名称 \v 显示详细硬件日期时间
-
-
文件
/etc/motd
:用户登陆时所提示的信息,所有用户以任何方式登陆都会提示此文件的信息
配置文件
login shell 和 non-login shell 所读取的配置文件不相同:
-
login shell
-
/etc/profile
该文件会调用以下文件:
-
/etc/profile.d/*.sh
只要该目录下用户具有r
权限的文件都会被调用。
目录内的文件又会调用以下文件:-
/etc/locale.conf
该文件由lang.sh
调用 -
/usr/share/bash-completion/complitions/*
该文件由
bash_completion.sh
调用
-
-
-
~/.bash_profile
或~/.bash_login
或~/.profile
bash 的 login shell 只会读取上面三个文件中的一个,读取顺序按上面的顺序。
该文件又会调用以下文件:~/.bashrc
/etc/bashrc
-
-
non-login shell
~/.bashrc
设置完配置文件之后所作修改不会立即生效,需要重新读入配置文件:
-
source
读入环境配置文件# 以下两个命令效果都一样 [root@study ~]# source ~/.bashrc [root@study ~]# . ~/.bashrc
数据流重定向
- 标准输入(stdin):代码为 0,使用 < 或 <<
- 标准输出(stdout):代码为 1,使用 > 或 >>
- 标准错误输出(stderr):代码为 2,使用 2> 或 2>>
注:> 为覆盖,>> 为累加
-
双重定向
tee
[root@study ~]# ls anaconda-ks.cfg anaconda-ks.cfg.cp etc.newer.then.passwd.tar.gz test test.tar.gz test.txt [root@study ~]# ls | tee ~/ls.txt anaconda-ks.cfg anaconda-ks.cfg.cp etc.newer.then.passwd.tar.gz test test.tar.gz test.txt [root@study ~]# cat ls.txt anaconda-ks.cfg anaconda-ks.cfg.cp etc.newer.then.passwd.tar.gz test test.tar.gz test.txt [root@study ~]# ls -l | tee -a ~/ls.txt 总用量 176 -rw-------. 1 root root 1879 7月 11 16:38 anaconda-ks.cfg -rw-------. 1 root root 1879 8月 28 11:52 anaconda-ks.cfg.cp -rw-r--r--. 1 root root 21422 8月 26 14:09 etc.newer.then.passwd.tar.gz -rw-r--r--. 1 root root 90 9月 15 15:37 ls.txt drwxr-xr-x. 2 root root 132 8月 28 15:27 test -rw-r--r--. 1 root root 136363 8月 26 14:01 test.tar.gz -rw-r--r--. 1 root root 77 8月 28 12:00 test.txt [root@study ~]# cat ls.txt anaconda-ks.cfg anaconda-ks.cfg.cp etc.newer.then.passwd.tar.gz test test.tar.gz test.txt 总用量 176 -rw-------. 1 root root 1879 7月 11 16:38 anaconda-ks.cfg -rw-------. 1 root root 1879 8月 28 11:52 anaconda-ks.cfg.cp -rw-r--r--. 1 root root 21422 8月 26 14:09 etc.newer.then.passwd.tar.gz -rw-r--r--. 1 root root 90 9月 15 15:37 ls.txt drwxr-xr-x. 2 root root 132 8月 28 15:27 test -rw-r--r--. 1 root root 136363 8月 26 14:01 test.tar.gz -rw-r--r--. 1 root root 77 8月 28 12:00 test.txt
特殊符号
cmd1 ; cmd2
不考虑命令相关性依次执行cmd1 && cmd2
cmd1 命令成功执行(返回0)时,cmd2 才执行cmd1 || cmd2
cmd1 命令不成功执行(返回不是0)时,cmd2 才执行cmd1 | cmd2
cmd1 命令的输出作为 cmd2 的输入