Linux零零碎碎的小知识

X Window与命令行切换

【CTRL +alt + F2~F6】命令行模式登陆tty2~tty6终端

【CTRL + alt + F1】图形用户界面模式

 

命令行模式下执行命令:

  1. 输入命令后面带选项时,前面会加-号,如-h,如果使用选项的全名,则使用的是--,如—help。
  2. 命令太长时,可以使用反斜杠(\)来转义回车键(注意\后面直接回车,不能有空格)。
  3. 命令选项前面不止可以是-号,还可以是+号。
  4. Tab:补全命令或文件名;CTRL +c:中断命令;CTRL +d:键盘输入结束(也可以用exit)。若想离开命令行模式,可以直接用CTRL +d(或输入exit)。
  5. 在命令行中翻页:【shift + page down】【shift + page up】。
  6. 观察有谁在线:【who】,查看网络联机状态:【netstat -a】,查看后台正在执行的程序:【ps -aux】。
  7. 将数据同步写入硬盘:【sync】,关机:【shutdown】,重启:【reboot】【halt】【poweroff】(若以物理终端(tty1~tty6)登陆,则可直接用上述命令关机,如果用远程登陆(如ssh, pietty)则关机需要root权限)

 

用户、用户组、权限:

  1. 第一个字符代表该文件是目录、文件或链接文件等:
    [d]目录

[-]文件

[l]链接文件

[b]设备文件里可供存储的周边设备

[c]设备文件里的串行端口设备

  1. 无论文件权限是什么,root都可读可写。
  2. 具有文件的x权限,说明可以被系统执行。但是能否删除文件,则取决于用户是否拥有该文件所在目录的w权限,w权限对文件夹而言:新建、删除文件或目录;将已存在的文件或目录更名;移动该目录内的文件或目录。X权限对文件夹而言:用户能否进入该目录成为工作目录。
  3. 任何设备在Linux下都是文件,类型包括:常规文件(纯文本文件,二进制文件,数据文件);目录[d];链接文件[l];设备与设备文件(包括区块设备文件[b]、字符设备文件[c]);数据传送文件[p](FIFO)。
  4. Linux文件没有扩展名,扩展名一般只用来提示该文件为某类文件。

 

Linux文件与目录管理:

  1. 切换到家目录:cd ~(或者只输入cd); 回到刚才的目录:cd –
  2. mkdir –p /home/twm/testing/teset1,则系统将自动将各层目录都建好。
  3. 为什么我在任何目录下都能执行/bin/ls这个命令?因为有$PATH这个环境变量,该环境变量由一堆目录组成,每个目录用冒号(:)隔开,/bin/这个路径被添加到PATH里,所以任何地方都能执行ls来找到/bin/ls执行文件。
  4. 修改时间(modification time,mtime):文件【内容数据】变更时更新该时间
    状态时间(status time,ctime):文件【状态】(权限、属性)改变时更新该时间
    读取时间(access time,atime):文件【内容被读取】时更新该时间
  5. ls显示出来的是mtime,touch命令可用于更新时间。
  6. 【ll】(两个L)命令即【ls -l】
  7. 特殊权限:当s出现在文件owner的x权限上时,被称为SUID权限(set UID),其功能有:
    SUID权限仅对二进制程序(binary program)有效
    执行者对于该程序需要具有x的可执行权限;
    本权限仅在执行该程序的过程中有效;
    执行者将具有该程序的owner权限
  8. 特殊权限:当s出现在用户组的x权限时称为SGID权限(set GID),其功能有:
    SGID对二进制程序有用;
    程序执行者对于该程序来说,需具备x权限;
    执行者在执行过程中将获得该程序用户组的支持。
    (SGID权限一般是给目录设置的,例如为同一小组的所有成员分配了同一个用户组和同一工作目录(该目录隶属该用户组),
    当其中一个成员在工作目录下新建一个文件时,这个文件自动属于这个用户组,如果该目录没有GID权限的话,那么每个成员新建的文件都属于自己而不属于该用户组,其他人也就无法改动)
  9. 特殊权限:SBIT(sticky Bit),只针对目录有效,功能为:
    当用户对于此目录具有w,x权限,即具有写入的权限;
    当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除该文件。
  10. 在设置普通权限的3个数字前再加一个数字,即代表特殊权限:
    SUID:4,SGID:2,SBIT:1
    如:chmod 4755 filename
    chmod u=rwxs,go=x filename

 

linux磁盘与文件系统管理

  1. 扇区:最小的物理存储单位,且依据磁盘设计的不同,目前主要有512B和4KB两种格式,将扇区组成一个圆,就是柱面(cylinder)。早期分区主要以柱面为最小分区单位,现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码)。
  2. 磁盘分区主要有2种格式:MBR分区表,GPT分区表。
  3. MBR分区表中,第一个扇区最重要,里面有:主引导记录(master boot record, MBR)和分区表(partition table),其中MBR占有446B,而分区表占有64B;
  4. GPT分区表除了分区数量扩充较多外,支持的磁盘容量也可超过2TB。
  5. 磁盘分区完后还要进行格式化(format),之后操作系统才能使用这个文件系统。为什么要格式化?因为每种操作系统所设置的文件属性/权限并不相同。
  6. 传统磁盘与文件系统应用:一个分区只能被格式化为一个文件系统,可以说一个文件系统就是一个硬盘分区。新技术如LVM、软件磁盘阵列(software raid)可以将一个分区格式化为多个文件系统,也能将多个分区合成一个文件系统。通常称一个可被挂载的数据为一个文件系统而不是一个分区。
  7. 操作系统的文件除了文件实际内容外,通常含有非常多的属性,例如Linux系统的文件权限(rwx)与文件属性(owner,group,时间参数等)。文件系统通常会将这两部分数据分别存放在不同的区块:权限与属性放在inode,实际数据放在数据区块。另外还有一个超级区块(superblock)会记录整个文件系统的整体信息:inode与数据区块的总量、使用量、剩余量、文件系统格式等。
  8. inode:与文件相对应,记录文件属性,一个文件占用一个inode,同时记录此文件的数据所在区块号码
    数据区块:实际记录文件的内容,若文件太大,会占用多个区块。
  9. U盘的文件系统一般为FAT格式,这种格式东躲文件系统并没偶inode存在,所以FAT没办法将这个文件的所有区块在一开始就读出来(其方式为上一个区块中记录着下一个区块的号码,所以要将下一个区块都出来后,才能知道下下个区块在何处)。
  10. 需要碎片整理的原因是文件写入的区块太过于离散,此时文件读取的性能将会变得很差,通过碎片整理可以将同一个文件的所属的区块集合在一起,这样读取比较容易。因此FAT的文件系统要时不时整理碎片一下。
  11. ext2文件系统格式化的时候基本上是区分为多个区块群组(block group),每个区块群组都有独立的inode、数据区块、超级区块系统。
  12. 文件系统最前面有个启动扇区,这个启动扇区可以安装引导程序,如此一来我们便可以将不同的启动引导程序安装到别的文件系统最前端,而不用覆盖整块磁盘唯一的MBR,这样便可制造出多重引导环境。
  13. 每个区块群组的6个主要内容:
    数据区块:格式化时区块大小已固定,且每个区块都有编号,方便inode记录。ext2支持的区块大小有1K,2K,4K(每个区块最多只能放一个文件,若文件小于区块大小,则剩余的区块容量不能再被使用,所以区块分的太小的话,大型文件会占用较多区块,inode要记录更多的区块号码,可能造成文件系统读写性能不佳);
    inode table:主要记录:该文件的大小、读写属性、owner、group、3种time等等。每个文件只占用一个inode,因此文件系统能建立的文件数量与inode的数量有关。系统读取文件时需要先找到inode,再分析inode记录的权限与用户是否符合,若符合才能读取区块内容。ext2系统将inode记录区块号码的区域定义为12个直接、1个间接、1个双间接、1个三间接记录区(再根据单个区块的大小(1K时),可以算出文件系统能够容纳的最大文件大小);
    superblock:主要记录:数据区块与inode数量,未使用的与已使用的inode、区块数量,数据区块、inode的大小,文件系统挂载时间,最近一次写入数据时间,最近一次检验磁盘(fsck)的时间等。
    filesystem description:描述每个区块群组的开始与结束区块,说明每个区段(超级区块、对照表、inode表、数据区块)分别介于哪一个区块之间。
    区块对照表(block bitmap):记录哪个区块是空的,哪个区块被使用了。
    inode对照表(inode bitmap):记录哪个inode号码没被使用,哪个被使用了。
    dumpe2fs:查询ext系列超级区块信息的命令。
  14. 目录:在Linux下的文件系统建立一个目录时,文件系统会分配一个inode与至少一块区块给该目录,inode是该目录的inode,而该目录的区块记录的是该目录下的文件名与该文件名占用的而不是文件占用的)inode号码数据(即inode本身不记录文件名,文件名的记录是在目录的区块中,因此新增、删除、修改文件名与目录的w权限有关)。
  15. 文件:当在ext2建立一个一般文件时,ext2会分配一个inode与相对于该文件大小的区块数量给该文件。例如,假设一个区块大小为4KB,要建立一个100KB的文件,则Linux将分配一个inode与25个区块来存储该文件。同时注意!由于inode只有12个直接指向,因此还需要一个区块来记录区块号码。
  16. 文件的读取:经过目录的inode与区块,找到待读取文件名对应的inode号码,再根据inode号码上的区块号码,读取相应区块上的文件数据。(不管是文件还是目录,都必须先读取到它的inode,才能读取它对应区块的内容,注意看第14条)
  17. 新增一个文件步骤:
    确定用户对于与新增文件的目录是否具有w和x权限,有的话才能新增;
    根据inode对照表找到没有使用的inode号码,降薪文件的权限/属性写入;
    根据区块对照表找到没有使用的区块好吗,将实际的数据写入区块,并更新inode的区块指向数据;
    将刚刚写入的inode与区块数据同步更新inode对照表和区块对照表,并更新超级区块。
  18. 日志式文件系统:为防止出现各种对照表、超级区块与实际数据存放不一致的情况,在文件系统中规划出一个区块,专门记录写入或修改文件时的步骤,以简化一致性检查步骤。
  19. 文件系统的运行:异步处理:当系统加载一个文件到内存后,若该文件没被修改,则在内存区段的文件数据被置为干净(clean),但如果内存中的文件数据被修改了,就被置为脏的(dirty),此时所有的操作都还在内存中执行,并没有写入磁盘,系统会不定时将内存中设置为dirty的数据写回磁盘(也可以用sync命令强行写入磁盘)。
  20. 文件系统与内存:系统会将常用的文件数据放置在内存的缓冲区,以加速文件系统的读写操作,因此linux的物理内存最后都会被用光,这是正常情况,可加速系统性能。正常关机时,关机命令会调用sync命令莱桨内存的数据写回磁盘中,若不正常关机,如停电,数据尚未写回磁盘,启后会花很多时间进行磁盘校验,甚至可能导致文件系统损坏(不是磁盘损坏)。
  21. 挂载:每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树中才能被我们使用。将文件系统与目录树结合的操作成为【挂载】,挂载点一定是目录,该目录是进入该文件系统的入口。
  22. 所有Linux系统都是通过一个名为VFS(virtual filesystem switch)的内核功能去读取文件系统,用户并不需要知道每个硬盘分区上面的文件系统是什么,VFS会帮我们做好读取工作。
  23. 文件系统的操作:鸟哥Linux P224
    可使用lsblk命令列出系统上所有的磁盘以及他们的文件系统个数,blkid可以列出每个文件系统的唯一信息,如果我们要新建一个分区(对应一个文件系统),则可以使用【gdisk/fdisk 磁盘名称】命令来管理(新增/删除/设置挂载点/重命名等)该磁盘的分区。用gdisk命令新增完一个分区后,接下来要对该分区(或者说文件系统)进行格式化(其实格式化应该被称为创建文件系统,gdisk命令只是用来创建分区,创建文件系统用mkfs命令),例如要格式化成xfs文件系统,则使用mkfs.xfs命令。创建完文件系统后,需要对该文件系统进行挂载/卸载(例如插入一个u盘后,要把它挂载到某个目录(挂载点)下,我们才能访问这个u盘,而这个挂载点就是这个u盘里的内容(如果原挂载点不是空的,则挂载后挂载点的内容会被暂时覆盖,直至卸载后原挂载点的内容才恢复)),挂载文件系统使用mount命令,重新挂载使用remount命令,卸载使用umount命令。

 

shell程序

  1. shell程序:提供用户操作系统的一个界面,可以调用其他软件,用户通过shell程序(即命令行模式)来操作这些应用程序,让这些应用程序调用内核来执行所需的任务。Linux使用的shell版本称为【Bourne Again shell,bash】
  2. 用户登录终端(tty)时,Linux系统就分配一个shell给用户,而这个登陆取得的shell就记录在/etc/passwd这个文件内(默认为bash)。
  3. Bash的主要优点:可查看历史命令;可补齐命令名或文件名;可给命令设置别名(alias);任务管理、前后台控制;程序化脚本;通配符用于帮助查询。
  4. ~/.bash_history记录的是前一次登陆所执行过的命令,而这一次登陆所执行的命令都被缓存在内存中。
  5. 你能不能在任何目录下执行某个命令,与环境变量PATH有关,例如执行ls命令时,如果在查找完PATH变量内记录的路径都找不到ls这个命令,就会在屏幕上显示【command not found】。
  6. 环境变量:系统需要一些变量来供他读写数据(或是一些环境的设置参数值,例如是否要显示彩色等),所以就需要环境变量来读入系统。为了区别于自定义变量,环境变量通常用大写字符表示。
  7. 打印变量:【echo $变量名】,变量设置规则:P319
  8. 观察环境变量:【env】(打印默认变量),【set】(会打印所有变量)
  9. 美元符号$本身也是一个变量,代表目前这个shell的进程号(PID)。
  10. 子进程:当用户登录Linux获得一个bash后,bash就是一个独立的进程,这个进程的识别使用的是进程标识符(PID)。接下来在这个bash下所执行的任何命令都是由这个bash所衍生的,那些被执行的命令就被称为子进程(所以说bash跟其他命令一样是Linux系统进程而已,bash并不是Linux系统,只是bash替我们调用其他命令(进程))。子进程仅会继承父进程的环境变量而不会继承的自定义变量(除非用export命令将自定义变量变成环境变量),所以在bash中的自定义变量在进入子进程后会消失,知道子进程调用完毕回到bash。
  11. 读取来自键盘输入的变量:【read】(常用于shell脚本编写中)。变量类型默认为字符串,声明变量类型:【declare】【typeset】
  12. 由于Linux可多个用户同时登录,所以要限制每个用户的某些系统资源(如可以开启的文件数量、可使用的cpu时间、可使用的内存总量):【ulimit】,有时候我们某些操作失败(如创建一个大容量文件失败),很可能是被ulimit限制了。
  13. 路径与命令的查找顺序:
    以相对/绝对路径执行命令,例如【/bin/ls】或【./ls】;
    由alias查找执行;
    由bash内置(builtin)的命令查找执行;
    通过$PATH这个变量的顺序查找到的第一个命令来执行。
  14. 为什么我们什么操作都没做,而一进入bash就能获得一堆有用的变量?因为系统有一些环境配置文件的存在:全局系统配置文件、用户个人偏好配置文件。我们自行定义的变量、别名等,在注销bash之后会失效,想要保住它就要将它写入配置文件,一般而言login shell只会读取这两个配置文件:
    /etc/profile:系统整体的设置(如PATH,MAIL,USER,HISTSIZE,umask等),每个用户登录bash时一定会读取,所以若要改所有用户的环境设置就改这里,最好不要改这个文件;
    ~/.bash_profile或~/.bash_login或~/.profile:属于用户个人设置,只要添加自己的数据就会写入这里,只会读取三个文件中的一个。
    由于上面两个配置文件都是在取得login shell的时候才会去读取,所以在设置好上面两个文件后需要注销再登录才能生效?如果想直接生效:用【source】命令。
  15. 除了上面提到的两个配置文件外,还有其他的配置文件:etc/man_db.conf, ~/.bash_logout, ~/.bash_history
  16. 终端环境设置:【stty】【set】(例如设置用哪个按键来作为删除键)
  17. 标准输出中,>:覆盖写入;>>:追加。1>和1>>:正确数据的覆盖写入和追加。2>和2>>:标准错误的覆盖写入和追加。
    例如:将stdout和stderr分别存到不同文件中:
    find /home -name .bashrc > list_right 2 > list_error
    /dev/null何以吃掉任何导向它的信息(相当于一个垃圾桶)
    将输出数据全部导入名为list的文件中:
    find /home -name .bashrc > list 2>&1    #相当于2>也导入和stdout同样的文件中
  18. 标准输入中,<:表示将原本需要由键盘输入的改为由指定文件内容输入。
    例如:cat > catfile < ~/.bashrc   # 原本cat默认由键盘输入,现在由~/.bashrc文件的内容作为输入,输入到catfile文件中
  19. 标准输入中,<< xxx  表示xxx作为结束输入的标志。
  20. 命令行中若一个命令执行成功则会返回0,即$?(命令返回值)=0,可以使用类似逻辑判断的语法:
    cmd1 && cmd2  #若cmd1正确执行($?=0)则开始执行cmd2,否则不执行cmd2;
    cmd1 || cmd2    #若cmd1正确执行,则cmd2不执行,否则执行cmd2.
  21. 逻辑判断式的结果是向右传递的,例如:
    A && B || C    # 若A返回失败($?不为0),则不执行B,错误结果继续向右传递,因此执行C;若A返回成功,则执行B,若B也成功则执行C,否则不执行。
  22. 使用管道(|)的命令必须能够接受标准输入的数据(有些命令不支持管道,可以用args命令)。

 

posted @ 2020-08-01 11:53  大黑耗  阅读(159)  评论(0编辑  收藏  举报