Linux基础

komantao 2020-02-26 2020-02-26 字数 14172 阅读量


一、文件系统

1、目录

运行ls /命令,查看根目录(Linux的树状目录结构),假设为:

Linux树状目录结构

分区/目录 作用
/ 系统根目录(文件系统),建议在根目录下面只有目录,不要直接有文件
/bin、/usr/bin、/usr/local/bin Binary的缩写,存放最经常使用的标准系统实用程序
/boot 启动目录,存放启动Linux时使用的一些核心文件,包括连接文件、镜像文件
/dev Device的缩写,设备目录,存放Linux的外部设备(以文件类型存放)
/etc 系统配置目录,存放所有的系统管理所需要的配置文件和子目录
/home 用户主目录,每个用户都有一个自己的个人目录,以用户账号命名
/lib、/usr/lib、/usr/local/lib 存放系统最基本的动态连接共享库,其作用类似于Windows的DLL文件。几乎所有的应用程序都需要用到这些共享库
/lost+found 一般情况下是空的,当系统非法关机后,这里就存放了一些文件
/media 挂载目录,linux系统会自动识别一些设备(例如U盘、光驱等),识别后,将识别的设备挂载到这个目录下
/mnt 挂载目录,是为了让用户临时挂载别的文件系统(例如将光驱挂载在/mnt/上),然后进入该目录就可以查看光驱里的内容了
/opt 存放额外安装软件的目录(例如安装一个ORACLE数据库),默认是空
/proc 虚拟目录(内容不在硬盘上而是在内存),它是系统内存的映射,可以通直接访问这个目录来获取系统信息
/root 系统管理员目录,也称作超级权限者的用户主目录
/sbin s代表Super User,存放系统管理员使用的系统管理程序
/selinux 是Redhat/CentOS特有目录,存放selinux相关的文件。Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂
/srv 存放服务启动之后需要提取的数据
/sys linux2.6内核的巨大变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建时,对应的文件和目录也在内核对象子系统中被创建。
/tmp 存放临时文件,一般网络服务器时才需要
/usr 软件存放目录,类似于windows下的program files目录
/usr/bin 系统用户使用的应用程序
/usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序
/usr/src 内核源代码默认的放置目录
/var 存放系统执行过程中经常变化的文件,例如缓存(cache)、登录文件(log file)
/run 临时文件系统,存储系统启动后的信息。系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run
/srv 一些服务服务需要访问的数据目录,如WWW服务器需要的网页数据就放在/srv/www中
swap 交换空间,相当于Windows上的虚拟内存,值为物理内存的2倍即可

目录的简捷符号表示:

  • /“:目录路径中起始位置的”/“表示根目录,其它位置的”/“表示分隔符

    Linux是以挂载方式存储(树状),源头是”/“(根目录),Linux Mint标识为“文件系统”。

  • ~“:表示当前用户的home目录

    每个用户都有自己的home目录(用户个人目录):root用户的home目录是“/root”,普通用户a的home目录是“/home/a”(当前的普通用户,Linux Mint标识为“主目录”)。

  • .”或“./”:表示当前目录,此处的”/“是目录路径中的分隔符

  • ..”或“../”:表示当前目录的父目录,此处的”/“是目录路径中的分隔符

  • 如果一个目录或文件名以一个点“.”开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。以默认方式查找时,不显示该目录或文件

2、查看磁盘

  • 在Linux终端运行df命令(或lsblk命令)查看磁盘的分区和已经使用量:

    $ df -h
    文件系统        容量  已用  可用 已用% 挂载点
    udev            1.9G     0  1.9G    0% /dev
    tmpfs           391M  1.5M  390M    1% /run
    /dev/sda1       118G  8.8G  103G    8% /
    tmpfs           2.0G     0  2.0G    0% /dev/shm
    tmpfs           5.0M  8.0K  5.0M    1% /run/lock
    tmpfs           2.0G     0  2.0G    0% /sys/fs/cgroup
    tmpfs           391M   24K  391M    1% /run/user/1000
    /dev/sr0        1.9G  1.9G     0  100% /media/xxx/Linux Mint 19.3 Cinnamon 64-bit
    
    • 文件系统:代表磁盘的分区和内存中的某一个区域
    • 挂载点:该文件系统挂载在哪一个目录下
    $ lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  120G  0 disk 
    └─sda1   8:1    0  120G  0 part /
    sr0     11:0    1  1.9G  0 rom  /media/koman/Linux Mint 19.3 Cinnamon 64-bit
    

    如图所示,机器只有一个磁盘sda,一个分区/dev/sda1,/dev/sr0是Linux Mint自动安装的媒体库,udev、tmpfs是系统运行时在内存划分的一部分区域,被临时挂载到文件树下。

  • 运行du命令查询当前目录下的所有目录/文件所占的容量

    $ du -ah
    
  • 在root用户权限下(标识符为#),运行dumpe2fs查看分区/dev/sda1的具体使用情况

    # dumpe2fs /dev/sda1
    dumpe2fs 1.44.1 (24-Mar-2018)
    Filesystem volume name:   <none>
    Last mounted on:          /
    …………
    
    • Filesystem volume name:文件系统的别名
    • Filesystem state:文件系统的状态,clean表示正常
    • Inode count:Inode的数量
    • Block count:Block块的数量

3、文件属性

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。对于root用户来说,一般情况下,文件的权限对其不起作用。

使用ll或者ls –l命令显示一个文件的属性、文件所属的用户和组,示例:

root@koman-vm:~# ll
总用量 56
drwx------ 11 root root 4096 2月  23 18:56 ./
drwxr-xr-x 23 root root 4096 2月  23 19:03 ../
drwx------  2 root root 4096 12月 14 00:45 .aptitude/
-rw-------  1 root root  803 2月  24 15:39 .bash_history
-rw-r--r--  1 root root 3106 4月   9  2018 .bashrc
drwx------  4 root root 4096 2月  23 16:31 .cache/
drwxr-xr-x  7 root root 4096 2月  24 11:23 .config/
…………

提取其中的一行:

drwxr-xr-x  7 root root 4096 2月  24 11:23 .config/
  • root(第一个):文件所属的用户

  • root(第二个):文件所属的组

  • 文件属性:drwxr-xr-x

    每个文件的属性由左边第一部分的10个字符来确定(属主指文件所有者,属组指所有者的同组用户):

    363003_1227493859FdXT

    • 第一个字符代表这个文件是目录、文件或链接文件等

      • d:目录
      • -:文件
      • l:链接文档(link file)
      • b:装置文件内的可供储存的接口设备(可随机存取装置)
      • c:装置文件内的串行端口设备(一次性读取装置),例如键盘、鼠标
    • 接下来的字符代表权限

      以三个为一组,且均为“rwx”三个参数的组合,这三个权限的位置不会改变,如果没有权限,则改为减号“-”。

      • r:代表可读(read)
      • w:代表可写(write)
      • x:代表可执行(execute)

4、文件连接

在Linux中,一个文件分为两个部分,一个是文件的权限和属性,另外一个是文件的具体内容,这两者分别存放在inode块和block块中。而每个block块都有一个索引号码,这个索引号码会被记录在inode里面。一个文件可能会很大,所以需要多个block块来存放一个文件的所有内容。每个block的索引都会被记录在inode里面。同时,每个单一文件只允许有一个inode块。

所以读取一个文件的流程是:先读取这个文件inode块里面存放的所有索引号码,然后按照号码去寻找对应的block块,最后读取block块里面的内容。

读取文件的node块的方法:通过目录读取。

Linux是一个目录树结构,所有文件全部存放在目录下,想要读取一个文件,必先读取其目录。一个目录也是由inode和block块构成,区别是目录的block块中存放的是该目录下所有文件的文件名和该文件的inode号码的映射。

示例:在root用户权限下(标识符为#)读取/bin/ln这个文件。

# ls -dil / /bin /bin/ln
      2 drwxr-xr-x 23 root root  4096 2月  23 19:03 /
2621441 drwxr-xr-x  2 root root  4096 2月  23 18:59 /bin
2621529 -rwxr-xr-x  1 root root 67808 1月  18  2018 /bin/ln
  • 读取“/”目录,因为“/”是挂载点,所以知道挂载点的inode号码是2
  • 读取bin目录,通过“/”的inode找到“/”的block块,在这个block块内查询看是否有“bin”这个文件名字,若有则返回对应的inode号码,也就是2621441
  • 通过编号为2621441的inode块来找到对应block块,并查询是否有ln这个文件名,若有则返回对应的inode号码,也就是2621529
  • 在2621529的inode中,查询所有保存了block索引的记录,并读取对应索引的block

4.1 硬连接

root用户权限下(标识符为#),在“/usr”目录下创建一个对“/bin/ln”的硬连接,名字是ln2:

# ln /bin/ln /usr/ln2              // ln命令创建硬连接
# ls -il /bin/ln /usr/ln2          // ls命令查看文件信息
2621529 -rwxr-xr-x 2 root root 67808 1  18  2018 /bin/ln
2621529 -rwxr-xr-x 2 root root 67808 1  18  2018 /usr/ln2
  • 在“/usr”目录下生成了ln2的文件,如果双击它,就会执行“/bin/ln”文件。最前面号码都是2621529,表示ln和ln2都是连接到同一个inode号码
  • 在-rwxr-xr-x后面的数字为2,代表有2个硬连接连接到了这个文件

4.2 软连接

硬连接只是在目录的block块里面添加了一条额外的映射记录,并没有多占用额外的inode块和block块,但是软连接就不同了。

软连接是直接新建一个文件。由于一个文件对应一个inode块和至少一个block块,所以新建一个软连接就至少会占用两个block块。inode的作用是记录属性权限和block索引,软连接的block块作用是保存要连接文件的完整路径。

# ln -s /bin/ln /usr/ln3              // ln命令创建硬连接
# ls -il /bin/ln /usr/ln3             // ls命令查看文件信息
2621529 -rwxr-xr-x 1 root root 67808 1月  18  2018 /bin/ln
5252590 lrwxrwxrwx 1 root root     7 2月  23 22:02 /usr/ln3 -> /bin/ln
  • 注意区别,两个文件的inode号码不一样!!说明新建了一个文件

  • 在-rwxr-xr-x后面的数字为1,代表只有1个硬连接连接到了这个文件

  • root后面的值通常代表文件内容的大小

    软连接的block块用来保存要连接文件的文件名,“/bin/ln”正好7个字符,一个字符就是一个byte,所以文件内容是7个byte。

二、磁盘分区

因为Linux的文件系统是一种树状结构,一个软件会把包含的众多文件,放置在不同的目录当中,所以不同的使用目的,每个目录扩张的速度会不一样。

  • 当计算机当作服务器使用时,变动的文件一般位于/var当中,所以/var应规划足够的空间
  • 当计算机当作日常桌用应用时,/home会增加使用量,所以/home要放大空间
  • 若计算机中会安装大量的软件,可能需要增加/usr的空间

当然,不将这些空间独立分割出去,一起使用/的空间,会有最好的空间使用效率,但这样容易造成系统不稳定,或发生其它问题(例如:当存储容量用尽时出现电脑无法开机现象)。

为了避免出现这样的情形,可以给电脑分区,然后将分区‘挂载’到根分区的指定目录,限制目录的大小,同时保护一些重要目录(例如/boot)。这样,即便某个目录扩张很快,最终也只会占用分配的大小,不会影响到电脑的正常运行。

所以应该将/boot和/home单独分区,避免/分区的内容扩张影响到系统启动;分配/home分区可以在电脑系统崩溃,重装系统时避免个人文件丢失,直接将分区挂载上去,个人的数据就不会丢失。

前面提到Linux文件系统的根目录,是一定要挂载的。没有特定指定分区挂载的目录,都会与根目录放在同一个分区中。

1、标准分区

1.1 分区过程

Linux的所有设备都被抽象为一个文件,保存在/dev目录下。根据接口可以分为:IDE、SATA、SAS、SCSI、USB。硬盘名称一般为:设备类型 + [a-z],其中 [a-z] 表示第几块硬盘。

  • IDE硬盘的名称一般是: hd[a-z]

  • SATA硬盘、SAS硬盘、SCSI硬盘和USB硬盘的名称一般为: sd[a-z]

    例如,第一块SATA硬盘名为 /dev/sda,第二块 SATA 硬盘名为 /dev/sdb,以此类推…

把一块硬盘的磁盘逻辑地分为几个区,每个区当作独立磁盘,以方便使用管理。

不同的分区用:“设备名 + 分区号”来表示,如第一块SATA硬盘的两个分区 sda1,sda2。

主流的分区机制有MBR和GPT。

磁盘分区有三种:主磁盘分区(ID值为83)、扩展磁盘分区(5)、逻辑分区(82,包括交换分区)。一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个。且主分区+扩展分区总共不能超过4个。逻辑分区可以有若干个。交换分区(swap)必须存在但一般不用。

主分区的作用就是计算机用来进行启动操作系统的,因此每一个操作系统的启动,或者称作是引导程序,都应该存放在主分区上。

运行fdisk命令进行磁盘分区:

  1. 运行df命令(或lsblk命令),获取磁盘在Linux中分配的名字

    $ lsblk                                      // 运行lsblk命令
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  120G  0 disk              //磁盘名为sda(/dev/sda),大小为120G
    └─sda1   8:1    0  120G  0 part /            //磁盘sda内的分区sda1,大小为120G
    sr0     11:0    1  1.9G  0 rom  /media/koman/Linux Mint 19.3 Cinnamon 64-bit  
    

    整个磁盘(sda)只有一个分区(sda1),大小为120G。

  2. 运行fdisk命令进入某个磁盘(/dev/sda)进行管理

    记住两个关键命令:w(将分区表写入磁盘并退出)、q(退出而不保存更改)。

    # fdisk /dev/sda                            // 必须在root用户下运行fdisk命令
       
    欢迎使用 fdisk (util-linux 2.31.1)。
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
       
       
    命令(输入 m 获取帮助): m                    // 输入m,获取帮助文档
    …………
    
    1. 输入p,查看分区情况

      命令(输入 m 获取帮助): p
      Disk /dev/sda:120 GiB,128849018880 字节,251658240 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
      磁盘标签类型:dos
      磁盘标识符:0x081735bc
            
      设备       启动  起点      末尾      扇区  大小 Id 类型
      /dev/sda1  *     2048 251656191 251654144  120G 83 Linux
      

      整个磁盘只有一个分区(ID值为83),大小为120G。所以输入n时,新增分区失败:

      命令(输入 m 获取帮助): n
      所有主分区的空间都在使用中。
      
    2. 输入d,删除分区

      命令(输入 m 获取帮助): d
      已选择分区 1
      分区 1 已删除。
      

      因为整个磁盘只有一个分区,所以无提示就直接删除分区1。

      此时若输入p,查看分区情况(磁盘内已没有分区):

      命令(输入 m 获取帮助): p
      Disk /dev/sda:120 GiB,128849018880 字节,251658240 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
      磁盘标签类型:dos
      磁盘标识符:0x081735bc
      
    3. 输入F,查看未分区的空闲区

      命令(输入 m 获取帮助): F
      未分区的空间 /dev/sda:120 GiB,128847970304 个字节,251656192 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
            
       起点      末尾      扇区  大小
       2048 251658239 251656192  120G
      
    4. 输入n,新增分区1

      命令(输入 m 获取帮助): n
      分区类型
         p   主分区 (0个主分区,0个扩展分区,4空闲)
         e   扩展分区 (逻辑分区容器)
      选择 (默认 p):                              // 直接按Enter键取默认值
            
      将使用默认回应 p。
      分区号 (1-4, 默认  1):                       // 直接按Enter键取默认值
      第一个扇区 (2048-251658239, 默认 2048):       // 直接按Enter键取默认值
      上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-251658239, 默认 251658239):+100G    //结束扇区,输入+100G,表示偏移100G空间
            
      创建了一个新分区 1,类型为“Linux”,大小为 100 GiB。
      分区 #1 包含一个 ext4 签名。
            
      您想移除该签名吗? 是[Y]/否[N]: N
      

      调整了原分区(sda1)的大小(由120G变为100G)。

      备注:fdisk的n选项,只能创建标准分区(类型为Linux),不能创建LVM分区(类型为Linux LVM)。

      此时,若输入F,查看未分区的空闲区:

      命令(输入 m 获取帮助): F
            
      未分区的空间 /dev/sda:20 GiB,21473787904 个字节,41940992 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
            
           起点      末尾     扇区 大小
      209717248 251658239 41940992  20G
      
    5. 输入n,新增分区2(大小为20G)

      命令(输入 m 获取帮助): n
      分区类型
         p   主分区 (1个主分区,0个扩展分区,3空闲)
         e   扩展分区 (逻辑分区容器)
      选择 (默认 p): 
            
      将使用默认回应 p。
      分区号 (2-4, 默认  2): 
      第一个扇区 (209717248-251658239, 默认 209717248): 
      上个扇区,+sectors 或 +size{K,M,G,T,P} (209717248-251658239, 默认 251658239): 
            
      创建了一个新分区 2,类型为“Linux”,大小为 20 GiB。
      

      此时,若输入p,查看分区情况:

      命令(输入 m 获取帮助): p
      Disk /dev/sda:120 GiB,128849018880 字节,251658240 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
      磁盘标签类型:dos
      磁盘标识符:0x081735bc
            
      设备       启动      起点      末尾      扇区  大小 Id 类型
      /dev/sda1            2048 209717247 209715200  100G 83 Linux
      /dev/sda2       209717248 251658239  41940992   20G 83 Linux
      
    6. 输入w,将分区表写入磁盘并退出

      命令(输入 m 获取帮助): w
      分区表已调整。
      正在同步磁盘。
      
  3. 格式化新分区

    运行lsblk命令,查看磁盘的分区:

     # lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  120G  0 disk 
    ├─sda1   8:1    0  100G  0 part /            //sda1挂载点为/(根目录)
    └─sda2   8:2    0   20G  0 part              //sda2挂载点空白
    sr0     11:0    1  1.9G  0 rom  /media/koman/Linux Mint 19.3 Cinnamon 64-bit
    

    将新分区(sda2)格式化为ext4格式:

    # mkfs -t ext4  /dev/sda2
    mke2fs 1.44.1 (24-Mar-2018)
    创建含有 5242624 个块(每块 4k)和 1310720 个inode的文件系统
    文件系统UUID:307aba12-27e2-43bd-9139-ec8f7de07383
    超级块的备份存储于下列块: 
     32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
     4096000
       
    正在分配组表: 完成                            
    正在写入inode表: 完成                            
    创建日志(32768 个块) 完成
    写入超级块和文件系统账户统计信息: 已完成 
    
  4. 将新分区(sda2)挂载到目录

    # mkdir /backup             // 新建一个目录(/backup)作为挂载目录
    # mount /dev/sda2 /backup   // 将sda2分区挂载到backup目录
    

    运行lsblk命令,查看磁盘的分区:

    # lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  120G  0 disk 
    ├─sda1   8:1    0  100G  0 part /
    └─sda2   8:2    0   20G  0 part /backup
    sr0     11:0    1  1.9G  0 rom  /media/koman/Linux Mint 19.3 Cinnamon 64-bit
    
  5. 永久挂载

    以root身份打开/etc/fstab文件,在末尾加入一行:

    /dev/sda2               /backup            ext4    defaults        0 0
    

    重启,就会自动挂载了。

1.2 分区方案

linux系统分区选择的文件系统:ex2、ex3、ex4都是linux的主流文件系统;xfs是RHEL/CentOS 7.x以上版本才有的高性能文件系统;VFAT是windows的文件系统;swap文件系统给swap分区;BIOS boot是用于引导的,非常小。

注意事项:

  • 绝对不可以与根目录放在不同分区的目录

    /bin、/sbin、/lib、/etc、/dev 这五个目录,绝对不可与/所在的分区分开,因为这五个目录,有系统必要的工具与资料存放。当根目录在开机过程中被挂载进来时,需要这些工具与资料来维持正常的运作。若是把这五个目录放在其它分区当中,系统就不能正常引导。

  • 不需要与根目录放在不同分区的目录

    如/cdrom、/mnt、/media、/proc、/run、/sys、/srv等,这些目录可以放到其它分区,但不需要。因为这些目录的存在,只是运作过程中,维持运作所需,大多不会占用空间。放到其它分区,也无益于系统的性能。如/mnt、/media、/cdrom只是提供一个挂载点,让实体存储媒体可以挂载而已;或如/sys、/proc其实是内存上的数据,上面所有的数据完全不会占用硬盘的空间。所以这些目录不需要额外的分区存放。

    在FHS的推荐当中提到,根目录所在的分区越小,越有助于系统的稳定,避免其它的干扰;发生错误时,也会比较容易进行维护修正;而且可以提高系统的性能。

  • 最好与根目录分开,单独分区的目录 所谓「最好」,是对整个作业系统的稳定而言,并非「必要」。只要”/”存在,Linux系统即可运作。 /home、/var、/usr三者必须思考哪些空间必须额外分割出来(参考后面各分区的作用)。当然就系统稳定来说,最好都分割出来。

    单独分区(例如/home)的最大好处,重新安装系统时,不需要特别去备份个人文件,只要在安装时,选择不要格式化这个分区,然后重新挂载为/home就不会丢失数据。

    还有一个特别的应用:假如在计算机上安装两个或更多的Linux系统,可以共享/home这个分区。简单地说,个人文件可以在切换到其它Linux系统时,仍正常使用。

日常使用只需要两个分区:/(根分区)和swap(交换分区),基本不会有任何影响,交换分区对于现在的电脑来说都不是必要,完全可以只分配一个根分区。Linux只需要一个/根分区就可以正常运行。

Linux分区,没有统一方法,不同的人有不同的方法,根据自己实际用途来分是最好的。

  • /swap(备选):相当于windows系统中的虚拟内存的概念

    • 运存 < 4GB,swap空间 = 运存大小*2
    • 4GB < 运存 < 16GB,swap空间 = 运存大小
    • 运存 > 16GB,swap空间 = 随意,最好不要为0
  • /boot(必需):存储引导信息和内核信息,不用太大,500M以内足够

  • /(必需):只存放系统相关文件,个人或网站重要数据不放在这里

  • /usr(备选):存储系统应用软件安装信息,软件多的话,给多点空间

  • /tmp(备选):存放服务器的log文件

  • /home(备选,个人用户):存放用户个人数据

  • /var(备选。服务器用户):存放服务器的相关文件,例如web服务、mysql服务等

  • /data(必需):将个人或服务器的重要数据单独分区,便于备份和管理

2、LVM分区

逻辑卷不是根分区都可以在线扩容和缩小;

根分区是可以在线扩容,但不可以在线缩小。

使用LVM安装Linux系统时,LVM自动创建了两个LV卷(逻辑分区)并自动划分容量:

image-20200304135733018

系统安装成功后,查看磁盘分区和已创建的PV、VG、LV的信息:

  • 查看磁盘分区

    • 运行命令:lsblk

      # lsblk
      NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
      sda                   8:0    0  120G  0 disk         // 磁盘sda
      └─sda1                8:1    0  120G  0 part         // 有一个分区sda1
        ├─mint--vg-root   253:0    0  119G  0 lvm  /       // 逻辑卷root
        └─mint--vg-swap_1 253:1    0  976M  0 lvm  [SWAP]  // 逻辑卷swap_1
      sr0                  11:0    1 1024M  0 rom 
      
    • 运行fdisk -l命令

      # fdisk -l
      Disk /dev/sda:120 GiB,128849018880 字节,251658240 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
      磁盘标签类型:dos
      磁盘标识符:0xcf4445bd
          
      设备       启动  起点      末尾      扇区  大小 Id 类型
      /dev/sda1  *     2048 251656191 251654144  120G 8e Linux LVM
          
          
      Disk /dev/mapper/mint--vg-root:119 GiB,127775277056 字节,249561088 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
          
          
      Disk /dev/mapper/mint--vg-swap_1:976 MiB,1023410176 字节,1998848 个扇区
      单元:扇区 / 1 * 512 = 512 字节
      扇区大小(逻辑/物理):512 字节 / 512 字节
      I/O 大小(最小/最佳):512 字节 / 512 字节
      
  • 查看已创建的PV、VG、LV

    • 查看详细信息

      # pvdisplay        // 查看已创建的物理卷(PV):/dev/sda1
      # vgdisplay        // 查看已创建的卷组(VG):mint-vg
      # lvdisplay        // 查看已创建的逻辑卷(LV):root、swap_1
      
    • 查看简略信息

      # pvs              // 查看已创建的物理卷(PV):/dev/sda1
        PV         VG      Fmt  Attr PSize    PFree 
        /dev/sda1  mint-vg lvm2 a--  <120.00g 44.00m
      # vgs              // 查看已创建的卷组(VG):mint-vg
        VG      #PV #LV #SN Attr   VSize    VFree 
        mint-vg   1   2   0 wz--n- <120.00g 44.00m
      # lvs              // 查看已创建的逻辑卷(LV):root、swap_1
        LV     VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
        root   mint-vg -wi-ao---- 119.00g                                     
        swap_1 mint-vg -wi-ao---- 976.00m
      

计划:调整逻辑卷root的容量。

2.1 修改根分区大小

根分区缩容和其他分区不同。因为缩容首先要umount分区。在开机情况下,无法umount根分区。原来想如果重启进Grub到resume模式下,是否可以不挂载根分区?经测试还是不行。只有使用os 光盘进resume,选择光盘挂载根分区。这样就满足了要求。

现状:

  • 逻辑卷root挂载于**/**(根分区),占满了分区sda1的空间;分区sda1占满了磁盘sda的空间

  • 无法在终端运行umount命令卸除逻辑卷root(根分区)

    # umount /dev/mint-vg/root
    umount: /: target is busy.   //根分区正在运行,只有加载根分区,才能运行终端
    
  • 由于无法卸除逻辑卷root,所以不能使用resize2fs命令调整其大小

    文件系统必须不被挂载才可以对/分区减小容量操作!!!

    # resize2fs /dev/mint-vg/root 60G
    resize2fs 1.44.1 (24-Mar-2018)
    /dev/mint-vg/root 上的文件系统已被挂载于 /;需要进行在线调整大小
    resize2fs: 不支持在线缩小块
    
  • 无法使用fdisk命令的n参数重新创建根分区

    根分区打算继续使用LVM,但fdisk命令的n参数只能创建标准分区(类型为Linux),不能创建LVM分区(类型为Linux LVM)。

解决方法:

  1. 开机时进入紧急模式

    参阅:在Ubuntu 18.04系统中启动到救援模式或紧急模式的方法

    开机时,系统进入BIOS启动界面:

    image-20200305163149024

    在BIOS界面消失时立即按ESC键进入Grub菜单,选择第一个条目并按e进行编辑:

    image-20200305163549144

    移动键盘方向键找到以“linux”开头的行:

    image-20200305164245663

    • 若存在“$vt_handof”,就删除它

    • 若想启动到救援模式,在该行末尾增加代码systemd.unit=rescue.target

      尝试挂载所有本地文件系统并尝试启动一些重要的服务,包括网络。

    • 若想启动到紧急模式,在该行末尾增加代码systemd.unit=emergency.target

      加载了带有只读根文件系统的最小环境,没有启用任何网络或其他服务。

    添加代码后(救援模式),按F10继续启动。几秒钟后,将以root用户身份(输入密码后)进入救援模式的命令行:

    image-20200306103342311

    输入命令mount -n -o remount,rw /,将根(/)文件系统修改为读/写模式:

    image-20200305204902447

  2. 输入lvm命令

    输入lvm命令,进入lvm界面,依次输入pvscan、vgscan、lvscan这三个命令扫描pv、vg、lv相关信息,然后输入 lvchange -ay /dev/mint-vg/root(根分区名称),激活/分区所在的逻辑卷,最后,输入quit返回到bash shell界面。

    image-20200305205123495

  3. 调整分区

    • 在缩小文件系统前先检查下硬盘:e2fsck -f /dev/mint-vg/root

      image-20200305205316793

    • 缩小文件系统大小:resize2fs /dev/mint-vg/root 60G

    • 输入lvm命令进入lvm模式,缩小逻辑卷:lvreduce -L 50G /dev/mint-vg/root

      系统会提示是否缩小逻辑卷,输入 y 确定。

    • 缩小逻辑卷成功后可输入vgdisplay、lvdisplay查看

    • 输入quit退出lvm模式

输入lvm命令,进入lvm界面,依次输入pvscan、vgscan、lvscan三个命令扫描pv、vg、lv相关信息,然后输入 lvchange -ay /dev/mint-vg/root(上文提到的/分区名称)此命令是激活/分区所在的逻辑卷,输入 quit返回到bash shell界面。

下一步是缩小文件系统大小和逻辑卷/dev/vgsrv/root,在缩小文件系统前先检查下硬盘,e2fsck -f /dev/vgsrv/root

缩小文件系统大小:resize2fs /dev/vgsrv/root 50G

输入lvm命令进入lvm模式,缩小逻辑卷:lvreduce -L 50G /dev/vgsrv/root

系统会进入是否缩小逻辑卷,输入 y 确定。

缩小逻辑卷成功后可输入vgdisplay,lvdisplay查看。输入exit可退出rescue模式。

六、用户和权限

安装Linux发行版时,根据填写的用户名称自动创建一个普通用户。进入Linux后,自动使用普通用户权限。Linux遵循非常艰难的权限模型,普通用户权限不高,只能运行有限命令,而root用户可以执行任何操作。

Linux的终端符显示的样式由终端的shell决定,但其构造方法一致:

  • 普通用户的终端符,Linux终端默认使用普通用户,假设为:

    koman@koman-vm:~$ 
    
    • koman:表示当前使用普通用户koman
    • @koman-vm:用户机器名
    • ~:当前目录为~~表示当前用户的home目录
    • $:普通用户的终端标识符
  • root用户的终端符,假设为:

    root@koman-vm:/home/koman# 
    
    • root:表示当前使用root用户
    • @koman-vm:用户机器名
    • /home/koman:当前目录为“/home/koman”
    • #:root用户的终端标识符

1、切换用户

Linux使用su命令切换用户,其语法为:

su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
  • USER:将要切换到的用户帐号。缺省时默认为root用户
  • -:指USER前面的-,前后有空格。切换用户时,同时改变Shell环境(工作目录)

示例:

komeny@koman-vm:~$ pwd                   // 当前用户为komeny,查看其工作目录
/home/komeny
komeny@koman-vm:~$ su koman              // 使用命令su,切换到用户koman
密码:                                    // 在普通用户权限下,切换用户需要输入密码
koman@koman-vm:/home/komeny$ pwd         // 查看用户koman的工作目录
/home/komeny                             // 切换了用户,命令su没有切换工作目录
koman@koman-vm:/home/komeny$ su - koman  // 使用命令su -,切换到用户koman
密码: 
koman@koman-vm:~$ pwd
/home/koman                              // 切换了用户,命令su -切换了工作目录
koman@koman-vm:~$ su                     // 缺省了USER,默认切换到root用户
密码: 
root@koman-vm:/home/koman# pwd
/home/koman
root@koman-vm:/home/koman# su -
root@koman-vm:~# pwd
/root
root@koman-vm:~# 

Linux使用exit命令(或快捷键Ctrl + D)退出当前Shell,其语法为:

exit [状态值]
  • 状态值:若不设置,Shell以预设值退出。状态值0代表执行成功,其它值代表执行失败

2、root用户

root用户不需要创建,Linux自动生成。

  • 普通用户切换到root用户,需要输入root用户的密码:

    komeny@koman-vm:~$ su                  // 从普通用户切换到root用户
    Password:                              // 要求输入root用户的密码
    su: Authentication failure             // 验证失败(因为没有设置root用户的密码)
    

    初始时,root用户没有设置密码,所以提示失败。需要手动设置root用户的密码:

    $ sudo passwd root                     // 通过sudo命令,临时获取root用户权限
    
  • root用户切换到普通用户,不需要输入普通用户的密码

    root@koman-vm:~# su koman
    koman@koman-vm:/root$ 
    
  • 在root用户权限下,可以重置任何已创建的普通用户的密码:

    root@koman-vm:/home/koman# passwd koman                //修改用户koman密码
    输入新的 UNIX 密码: 
    重新输入新的 UNIX 密码: 
    passwd:已成功更新密码
    

禁用和启用root登录:

  • 禁用:sudo passwd -l root,只是禁用root,依然保存root密码
  • 启用:sudo passwd -u root

3、普通用户

安装Linux发行版时,根据填写的用户名称自动创建一个普通用户。

新增普通用户的操作步骤:

  1. 创建用户

    koman@koman-vm:~$ su                                 // 普通用户切换到root用户
    密码:                                                // 输入root用户密码
    root@koman-vm:/home/koman# adduser komeny            // 创建新用户komeny
    正在添加用户"komeny"...
    正在添加新组"komeny" (1001)...
    正在添加新用户"komeny" (1001) 到组"komeny"...
    创建主目录"/home/komeny"...
    正在从"/etc/skel"复制文件...
    输入新的 UNIX 密码:                                   // 设置用户komeny的密码 
    重新输入新的 UNIX 密码:                                // 确认密码
    passwd:已成功更新密码
    正在改变 komeny 的用户信息
    请输入新值,或直接敲回车键以使用默认值
     全名 []: 
     房间号码 []: 
     工作电话 []: 
     家庭电话 []: 
     其它 []: 
    这些信息是否正确? [Y/n] y                              // 输入y后,用户创建成功
    
  2. 赋予root权限

    1. 设置权限组(group)

      打开权限配置文件(/etc/sudoers,“以root身份打开”etc目录,然后使用文本编辑器打开sudoers文件),添加一个新的管理权限组:

      # Allows people in group wheel to run all commands
      %wheel    ALL=(ALL)    ALL                          // 新增一个权限组wheel
      

      若不喜欢添加新组,可选择已有的组admin(不建议)。

    2. 将新用户添加入新组wheel

    将新用户添加入管理权限组

    /etc/sudoers文件是权限的设置文件,“以root身份打开”etc目录,然后使用文本编辑器打开sudoers文件,搜索以下内容,删掉前面的注释符#(若无,则添加):

    ## Allows people in group wheel to run all commands
    %wheel    ALL=(ALL)    ALL                              // 设置一个权限组
    

八、Linux基本命令

1、apt命令

Ubuntu 16.04发布时,引入了apt命令(替代apt-get)。越来越多的其它Linux发行版也开始遵循Ubuntu的脚步,开始鼓励用户使用apt而不是apt-get。简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

apt命令通常需要获得root,所以一般在前边加上sudo。

命令 描述
apt autoclean 删除已卸载软件包的备份(包的.deb安装文件)
apt autoremove 包名 删除软件包和依赖包(所有包中不再使用的包)
apt depends 包名 显示软件包的依赖
apt rdepends 包名 显示软件包被哪些包依赖
apt check 更新缓存,检查是否有损坏的依赖
apt update 刷新软件源(存储库索引,获取包的更新信息)
apt upgrade (根据本地存储库索引)升级所有可升级的软件包
apt full-upgrade 升级软件包时自动处理依赖关系
apt install 包名 安装软件包,包名可以使用正则匹配,用空格区分多个包
apt source 包名 下载指定包的源代码
apt build-dep 包名 安装相关的编译环境
apt download 包名 下载二进制包到当前目录
apt remove 包名 删除已安装的软件包(保留配置文件)
apt purge 包名 删除已安装的软件包和配置文件
apt clean 删除已安装包的下载包(/var/cache/apt/archives目录中的软件包)
apt search 包名 搜索软件包
apt show 包名 显示安装细节
apt list 列出包含条件的包(已安装,可升级等)
apt edit-sources 编辑源列表

参阅:Linux中apt与apt-get命令的区别与解释

1、安装

apt install安装过程有部分(依赖)软件包下载失败

  1. 运行apt-get update刷新软件列表
  2. apt install加上选项--fix-missing再尝试修复安装

apt install的安装路径由包的维护者确定(不是用户)。

系统安装软件时:文档一般在**/usr/share**、可执行文件**/usr/bin**、配置文件**/etc**、lib文件**/usr/lib**。

查看软件的安装路径:dpkg -L 软件包名

komeny@KVM:~$ dpkg -L kivy
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/kivy
/usr/share/doc/kivy/changelog.Debian.gz
/usr/share/doc/kivy/copyright

在**/var/cache/apt/archives/**可以找到你安装程序的包。

2、卸载

示例:ubuntu卸载桌面环境

  1. 卸载掉gnome-shell主程序:sudo apt remove gnome-shell
  2. 卸载掉gnome:sudo apt remove gnome
  3. 彻底卸载删除gnome的相关配置文件:sudo apt purge gnome
  4. 卸载不需要的依赖关系:sudo apt autoremove
  5. 清理安装gnome时候留下的缓存程序软件包:sudo apt autoclean && sudo apt clean

2、查看命令

查看指定包是否已安装

$ dpkg-query -l firefox        # 包名可使用通配符支持模糊查询
dpkg-query: no packages found matching firefox

查看包(示例为zsh)的安装位置的方法:

  1. 运行该程序

    $ zsh
    
  2. 用命令ps -e, 找到对应的程序名字

    $ ps -e
      PID TTY          TIME CMD
        1 ?        00:00:00 init
     4561 tty1     00:00:00 init
     4562 tty1     00:00:00 bash
     4584 tty1     00:00:00 ps
    
  3. 使用命令查看对应程序的位置

    • find

       sudo find / -name zsh
      
    • dpkg -L:已知软件使用apt install命令安装,可以使用这种方法

      dpkg -L zsh
      
    • whereis

      whereis zsh
      
    • locate

      locate zsh
      
    • which

      which zsh
      
    • type

      type zsh
      

3、配置

  1. 安装ssh服务

    $ udo apt-get install openssh-server
    $ sudo service sshd status             # 查看状态,默认已启动
    
  2. 设置root用户的密码

    user@Ubuntu:~$ su -                    # 从普通用户切换到root用户
    密码:                                   # 输入普通用户的密码
    root@Ubuntu:~# passwd                  # 在root用户下输入命令
    输入新的 UNIX 密码: 
    重新输入新的 UNIX 密码: 
    passwd:已成功更新密码
    root@Ubuntu:~# 
    
  3. 设置sudo免密

    在%sudo ALL=(ALL:ALL) ALL下面添加一行$username  ALL=(ALL) NOPASSWD: ALL

       
    

更新软件:

  • sudo apt upgrade:不会对系统产生重大影响,可以在任何时候运行
  • sudo apt full-upgrade:慎用!需要升级整个系统时,会删除已安装的软件包
  • sudo apt dist-upgrade:慎用!涉及核心的升级,会对系统功能产生实际影响,可能在需要的情况下卸载一些已经安装的软件也可能安装一些额外的软件

Ubuntu完全教程

Linux下功能强大的软件大多是命令行的,图形界面的程序只能视觉上强大,外强中干!建议您多使用man这个命令来查询各类软件的使用方法,它排版美观,格式工整,语法简明,意韵流畅,实在是学习英语难得的教材。

Linux怎么占用这么多内存?

Linux会最大程度的利用物理内存,避免使用交换空间;而不是尽量的回收内存,使用页面文件。

又因为Linux系统的内存管理非常优秀,程序退出时可以高效的回收内存,所以更加没有必要在程序运行时就回收内存!

因此,Linux系统表面看来内存开销很大,实际上系统运行是很稳定的──Linux不会时而流畅,时而瘫痪。事实上,在正常情况下,它运行是非常流畅的。

参考资料

操作环境

  • 操作系统:Win 10

感谢您的赞赏支持:

Copyright © 2020 komantao. All Rights Reserved.