鸟哥linux私房菜学习笔记

linux 学习笔记

文章目录

磁盘分区

1. MBR

Master Boot Record,主引导记录

img

第一扇区是主要扇区,此扇区通常有 512 B大小,记录:

  1. 主引导记录(master boot record)

    安装启动引导程序的地方,有 446 B

    • 启动引导程序

      • 加载操作系统内核文件

      • 操作系统安装在 MBR 上的一个软件

      • 多操作系统时提供选项选择启动哪个系统

        转交其他引导程序引导,其他引导程序安装在相应分区的启动扇区

  2. 分区表(portion table)

    记录整块硬盘分区状态,有 64 B

    • 只能记录四组分区

      每组分区大小为 16 B

      1. 主要分区(Primary)

        实际记录数据的分区,可格式化。

      2. 扩展分区(Extended):最多只能有一个

        使用额外扇区记录分区信息,不能格式化。

        可再分区,称逻辑分区。

        1. 逻辑分区(Logical)

          和主要分区差不多。

          设备号码从 5号(/dev/sda5)开始,因为前四个号码分给主要分区和扩展分区

    • 每组记录该分区开始和结束柱面号码

分区的最小单位为一个柱面

分区只对分区表进行设置。

系统写入磁盘时先参考分区表,再针对某个分区进行数据处理。

每个分区都会有自己启动扇区(boot sector)。

无法使用 2.2 TB 以上的硬盘

2. GPT

GUID partition table

扇区为逻辑区块,每个区块对应一个逻辑区块地址(Logical Block Address)。

扇区大小不止 512 B。

前 34 个 LBA 记录分区信息,后 34 个 LBA 为分区信息的备份:

  1. LBA0( MBR 兼容区块)

    • 446 B 区块:存储第一阶段的启动引导程序
    • 分区表:仅存储一个特殊标志符,表示磁盘为 GPT 格式之意,不支持 GPT 分区的磁盘管理程序不会识别
  2. LBA1( GPT 表头记录)
    记录一下内容:

    • 分区表的位置与大小

    • 备份的 GPT 分区的位置

    • 分区表的校验码( CRC32)

      操作系统通过此校验码判断 GPT 是否正确,若错误则从备份 GPT 恢复

  3. 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. 分区的意义

  1. 数据安全性

    例如 windows 系统重装时只影响 C 盘,对其他盘无影响

  2. 提高系统性能

    若磁盘的的一个分区的分区范围为 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 目录结构

img

所有文件都是由根目录(/)衍生而来:

1. bin

Linux 命令汇总

日期命令

  • date

    显示日期命令

  • cal

    显示日历命令,calendar

计算器

  • bc

    计算器,binary calculator

在线求助

  • man

    查看手册,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 一些可以参考的范例
  • info

    查看手册,information

关机重启

shutdown

关机命令

reboot

重启命令

sync

数据同步写入磁盘,synchronize

halt

关机命令

poweroff

关机命令

suspend

休眠命令

文件管理

file

观察文件类型

umask

文件默认权限,user mask

chattr

修改文件隐藏属性,change attribute

lsattr

显示文件隐藏属性,list attribute

touch

修改文件时间或创建文件

chgrp

修改文件用户组,change group

chown

修改文件所有者,change owner

chmod

修改文件权限,change mode

目录管理

cd

切换目录,change directory

pwd

打印当前工作目录,print working directory

mkdir

建立新目录,make directory

rmdir

删除空目录,remove directory

文件与目录管理

ls

列出文件和目录,list

cp

复制文件或目录,copy

rm

删除文件或目录,remove

mv

移动文件或目录,move

获取文件名与路径

basename

获取文件名

dirname

获取文件路径

文件内容查看

cat

从第一行查看,concatenate

tac

从最后一行查看,tail concatenate

nl

显示行号查看 number lines

more

一页一页查看

less

与more类似,可往前翻页

head

只查看前几行

tail

只查看后几行

od

二进制方式查看,ordinary

  • zcat
    压缩文件查看,与 cat 类似
  • zmore
    压缩文件查看,与 more 类似
  • zless
    压缩文件查看,与 less 类似

查找命令

which

根据 PATH 环境变量查找

whereis

只查找特定目录的文件

locate

通过已建立数据库 /var/lib/mlocate 查找

  • updatedb
    更新数据库文件

find

磁盘查找

操作文件系统

容量查看

  • 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 822 12:12 source.txt
    [root@study test]# ln source.txt ./hardln.txt
    [root@study test]# ll
    总用量 0
    -rw-r--r--. 2 root root 0 822 12:12 hardln.txt
    -rw-r--r--. 2 root root 0 822 12:12 source.txt
    

    优点:

    • 安全,无论删除哪个文件另一个文件都可以正常使用
    • 同步,无论编辑哪个文件,另一个文件也会修改

    缺点:

    • 不能跨文件系统
    • 不能链接目录
  • 符号链接

    新分配一个 inode 和 block,文件名指向 inode,inode 指向 block,block 内存储目标文件的路径
    例:

    [root@study test]# ll
    总用量 0
    -rw-r--r--. 1 root root 0 822 12:12 source.txt
    [root@study test]# ln -s source.txt ./signln.txt
    [root@study test]# ll
    总用量 0
    lrwxrwxrwx. 1 root root 10 822 15:16 signln.txt -> source.txt
    -rw-r--r--. 1 root root  0 822 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 时,该文件系统是否会被主动测试挂载,默认为 auto
      rw/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 文件系统

创建交换分区

当内存不够用时,系统就会将暂不使用的程序与数据放到交换分区中

步骤:
使用物理分区:

  1. 分区
    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 
    
  2. 格式化为 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" 
    
  3. 加载

    [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
    

使用文件:

  1. 创建大文件

    [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 825 19:10 /tmp/swap
    
  2. 格式化为 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
    
  3. 加载

    [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](旧系统)
  1. 磁盘命名方式只与 Linux 内核检测顺序有关,与实际插槽无关

例如:若主板有六个SATA插槽,只有一插槽和五插槽插有磁盘,则

SATA1:/dev/sda

SATA5:/dev/sdb

shell

shell 是用于代替用户与系统内核沟通的壳程序

分为图形化shell命令行shell

  • 图形化shell:KDE、Gnome等桌面应用程序
  • 命令行shell:bash、zsh等终端模拟器

又可分为login shellnon-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 用户时为 `#̲`,其他用户为 ``
    • $:此 shell 的 PID
    • ?:上个命令的返回值
  • export

    将变量设置成环境变量

  • stty
    终端环境设置

命令查找顺序

  1. 相对/绝对路径
  2. alias 别名
  3. bash 内置命令
  4. 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 711 16:38 anaconda-ks.cfg
    -rw-------. 1 root root   1879 828 11:52 anaconda-ks.cfg.cp
    -rw-r--r--. 1 root root  21422 826 14:09 etc.newer.then.passwd.tar.gz
    -rw-r--r--. 1 root root     90 915 15:37 ls.txt
    drwxr-xr-x. 2 root root    132 828 15:27 test
    -rw-r--r--. 1 root root 136363 826 14:01 test.tar.gz
    -rw-r--r--. 1 root root     77 828 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 711 16:38 anaconda-ks.cfg
    -rw-------. 1 root root   1879 828 11:52 anaconda-ks.cfg.cp
    -rw-r--r--. 1 root root  21422 826 14:09 etc.newer.then.passwd.tar.gz
    -rw-r--r--. 1 root root     90 915 15:37 ls.txt
    drwxr-xr-x. 2 root root    132 828 15:27 test
    -rw-r--r--. 1 root root 136363 826 14:01 test.tar.gz
    -rw-r--r--. 1 root root     77 828 12:00 test.txt
    

特殊符号

  • cmd1 ; cmd2
    不考虑命令相关性依次执行
  • cmd1 && cmd2
    cmd1 命令成功执行(返回0)时,cmd2 才执行
  • cmd1 || cmd2
    cmd1 命令不成功执行(返回不是0)时,cmd2 才执行
  • cmd1 | cmd2
    cmd1 命令的输出作为 cmd2 的输入

猜你喜欢

转载自blog.csdn.net/qq_52554169/article/details/130888429