X Windows 与命令行切换
[CTRL +alt + F2~F6] 命令行模式登陆 tty2~tty6 终端
[CTRL + alt + F1] 图形用户界面模式
命令行模式下执行命令:
输入命令后面带选项时, 前面会加 - 号, 如 - h, 如果使用选项的全名, 则使用的是 --, 如 - help.
命令太长时, 可以使用反斜杠 (\) 来转义回车键(注意 \ 后面直接回车, 不能有空格).
命令选项前面不止可以是 - 号, 还可以是 + 号.
Tab: 补全命令或文件名; CTRL +c: 中断命令; CTRL +d: 键盘输入结束(也可以用 exit). 若想离开命令行模式, 可以直接用 CTRL +d(或输入 exit).
在命令行中翻页:[shift + page down] [shift + page up] .
观察有谁在线:[who] , 查看网络联机状态:[netstat -a] , 查看后台正在执行的程序:[ps -aux] .
将数据同步写入硬盘:[sync] , 关机:[shutdown] , 重启:[reboot] [halt] [poweroff] (若以物理终端 (tty1~tty6) 登陆, 则可直接用上述命令关机, 如果用远程登陆 (如 SSH, pietty) 则关机需要 root 权限)
用户, 用户组, 权限:
第一个字符代表该文件是目录, 文件或链接文件等:
[d]目录
[-]文件
[l]链接文件
[b]设备文件里可供存储的周边设备
[c]设备文件里的串行端口设备
无论文件权限是什么, root 都可读可写.
具有文件的 x 权限, 说明可以被系统执行. 但是能否删除文件, 则取决于用户是否拥有该文件所在目录的 w 权限, w 权限对文件夹而言: 新建, 删除文件或目录; 将已存在的文件或目录更名; 移动该目录内的文件或目录. X 权限对文件夹而言: 用户能否进入该目录成为工作目录.
任何设备在 Linux 下都是文件, 类型包括: 常规文件(纯文本文件, 二进制文件, 数据文件); 目录[d]; 链接文件[l]; 设备与设备文件(包括区块设备文件[b], 字符设备文件[c]); 数据传送文件[p](FIFO).
Linux 文件没有扩展名, 扩展名一般只用来提示该文件为某类文件.
Linux 文件与目录管理:
切换到家目录: cd ~(或者只输入 cd); 回到刚才的目录: cd -
mkdir -p /home/twm/testing/teset1, 则系统将自动将各层目录都建好.
为什么我在任何目录下都能执行 / bin/ls 这个命令? 因为有 $PATH 这个环境变量, 该环境变量由一堆目录组成, 每个目录用冒号 (:) 隔开,/bin / 这个路径被添加到 PATH 里, 所以任何地方都能执行 ls 来找到 / bin/ls 执行文件.
修改时间(modification time,mtime): 文件[内容数据] 变更时更新该时间
状态时间 (status time,ctime): 文件[状态] (权限, 属性) 改变时更新该时间
读取时间(access time,atime): 文件[内容被读取] 时更新该时间
ls 显示出来的是 mtime,touch 命令可用于更新时间.
[ll] (两个 L)命令即[ls -l]
特殊权限: 当 s 出现在文件 owner 的 x 权限上时, 被称为 SUID 权限(set UID), 其功能有:
SUID 权限仅对二进制程序 (binary program) 有效;
执行者对于该程序需要具有 x 的可执行权限;
本权限仅在执行该程序的过程中有效;
执行者将具有该程序的 owner 权限
特殊权限: 当 s 出现在用户组的 x 权限时称为 SGID 权限(set GID), 其功能有:
SGID 对二进制程序有用;
程序执行者对于该程序来说, 需具备 x 权限;
执行者在执行过程中将获得该程序用户组的支持.
特殊权限: SBIT(sticky Bit), 只针对目录有效, 功能为:
当用户对于此目录具有 w,x 权限, 即具有写入的权限;
当用户在该目录下建立文件或目录时, 仅有自己与 root 才有权力删除该文件.
在设置普通权限的 3 个数字前再加一个数字, 即代表特殊权限:
SUID:4,SGID:2,SBIT:1
如: chmod 4755 filename
chmod u=rwxs,go=x filename
Linux 磁盘与文件系统管理
扇区: 最小的物理存储单位, 且依据磁盘设计的不同, 目前主要有 512B 和 4KB 两种格式, 将扇区组成一个圆, 就是柱面(cylinder). 早期分区主要以柱面为最小分区单位, 现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码).
磁盘分区主要有 2 种格式: MBR 分区表, GPT 分区表.
MBR 分区表中, 第一个扇区最重要, 里面有: 主引导记录 (master boot record, MBR) 和分区表(partition table), 其中 MBR 占有 446B, 而分区表占有 64B;
GPT 分区表除了分区数量扩充较多外, 支持的磁盘容量也可超过 2TB.
磁盘分区完后还要进行格式化(format), 之后操作系统才能使用这个文件系统. 为什么要格式化? 因为每种操作系统所设置的文件属性 / 权限并不相同.
传统磁盘与文件系统应用: 一个分区只能被格式化为一个文件系统, 可以说一个文件系统就是一个硬盘分区. 新技术如 LVM, 软件磁盘阵列 (software raid) 可以将一个分区格式化为多个文件系统, 也能将多个分区合成一个文件系统. 通常称一个可被挂载的数据为一个文件系统而不是一个分区.
操作系统的文件除了文件实际内容外, 通常含有非常多的属性, 例如 Linux 系统的文件权限 (rwx) 与文件属性 (owner,group, 时间参数等). 文件系统通常会将这两部分数据分别存放在不同的区块: 权限与属性放在 inode, 实际数据放在数据区块. 另外还有一个超级区块(superblock) 会记录整个文件系统的整体信息: inode 与数据区块的总量, 使用量, 剩余量, 文件系统格式等.
inode: 记录文件属性, 一个文件占用一个 inode, 同时记录此文件的数据所在区块号码
数据区块: 实际记录文件的内容, 若文件太大, 会占用多个区块.
U 盘的文件系统一般为 FAT 格式, 这种格式东躲文件系统并没偶 inode 存在, 所以 FAT 没办法将这个文件的所有区块在一开始就读出来(其方式为上一个区块中记录着下一个区块的号码, 所以要将下一个区块都出来后, 才能知道下下个区块在何处).
需要碎片整理的原因是文件写入的区块太过于离散, 此时文件读取的性能将会变得很差, 通过碎片整理可以将同一个文件的所属的区块集合在一起, 这样读取比较容易. 因此 FAT 的文件系统要时不时整理碎片一下.
ext2 文件系统格式化的时候基本上是区分为多个区块群组(block group), 每个区块群组都有独立的 inode, 数据区块, 超级区块系统.
文件系统最前面有个启动扇区, 这个启动扇区可以安装引导程序, 如此一来我们便可以将不同的启动引导程序安装到别的文件系统最前端, 而不用覆盖整块磁盘唯一的 MBR, 这样便可制造出多重引导环境.
每个区块群组的 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 系列超级区块信息的命令.
目录: 在 Linux 下的文件系统建立一个目录时, 文件系统会分配一个 inode 与至少一块区块给该目录, inode 是该目录的 inode, 而该目录的区块记录的是该目录下的文件名与该文件名占用的(而不是文件占用的)inode 号码数据(即 inode 本身不记录文件名, 文件名的记录是在目录的区块中, 因此新增, 删除, 修改文件名与目录的 w 权限有关).
文件: 当在 ext2 建立一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的区块数量给该文件. 例如, 假设一个区块大小为 4KB, 要建立一个 100KB 的文件, 则 Linux 将分配一个 inode 与 25 个区块来存储该文件. 同时注意! 由于 inode 只有 12 个直接指向, 因此还需要一个区块来记录区块号码.
文件的读取: 经过目录的 inode 与区块, 找到待读取文件名对应的 inode 号码, 再根据 inode 号码上的区块号码, 读取相应区块上的文件数据.(不管是文件还是目录, 都必须先读取到它的 inode, 才能读取它对应区块的内容, 注意看第 14 条)
新增一个文件步骤:
确定用户对于与新增文件的目录是否具有 w 和 x 权限, 有的话才能新增;
根据 inode 对照表找到没有使用的 inode 号码, 降薪文件的权限 / 属性写入;
根据区块对照表找到没有使用的区块好吗, 将实际的数据写入区块, 并更新 inode 的区块指向数据;
将刚刚写入的 inode 与区块数据同步更新 inode 对照表和区块对照表, 并更新超级区块.
日志式文件系统: 为防止出现各种对照表, 超级区块与实际数据存放不一致的情况, 在文件系统中规划出一个区块, 专门记录写入或修改文件时的步骤, 以简化一致性检查步骤.
文件系统的运行: 异步处理: 当系统加载一个文件到内存后, 若该文件没被修改, 则在内存区段的文件数据被置为干净(clean), 但如果内存中的文件数据被修改了, 就被置为脏的(dirty), 此时所有的操作都还在内存中执行, 并没有写入磁盘, 系统会不定时将内存中设置为 dirty 的数据写回磁盘(也可以用 sync 命令强行写入磁盘).
文件系统与内存: 系统会将常用的文件数据放置在内存的缓冲区, 以加速文件系统的读写操作, 因此 Linux 的物理内存最后都会被用光, 这是正常情况, 可加速系统性能. 正常关机时, 关机命令会调用 sync 命令莱桨内存的数据写回磁盘中, 若不正常关机, 如停电, 数据尚未写回磁盘, 启后会花很多时间进行磁盘校验, 甚至可能导致文件系统损坏(不是磁盘损坏).
挂载: 每个文件系统都有独立的 inode, 区块, 超级区块等信息, 这个文件系统要能够链接到目录树中才能被我们使用. 将文件系统与目录树结合的操作成为[挂载] , 挂载点一定是目录, 该目录是进入该文件系统的入口.
所有 Linux 系统都是通过一个名为 VFS(virtual filesystem switch)的内核功能去读取文件系统, 用户并不需要知道每个硬盘分区上面的文件系统是什么, VFS 会帮我们做好读取工作.
文件系统的操作: 鸟哥 Linux P224
可使用 lsblk 命令列出系统上所有的磁盘以及他们的文件系统个数, blkid 可以列出每个文件系统的唯一信息, 如果我们要新建一个分区 (对应一个文件系统), 则可以使用[gdisk/fdisk 磁盘名称] 命令来管理(新增 / 删除 / 设置挂载点 / 重命名等) 该磁盘的分区. 用 gdisk 命令新增完一个分区后, 接下来要对该分区 (或者说文件系统) 进行格式化 (其实格式化应该被称为创建文件系统, gdisk 命令只是用来创建分区, 创建文件系统用 mkfs 命令), 例如要格式化成 xfs 文件系统, 则使用 mkfs.xfs 命令. 创建完文件系统后, 需要对该文件系统进行挂载 / 卸载(例如插入一个 u 盘后, 要把它挂载到某个目录(挂载点) 下, 我们才能访问这个 u 盘, 而这个挂载点就是这个 u 盘里的内容(如果原挂载点不是空的, 则挂载后挂载点的内容会被暂时覆盖, 直至卸载后原挂载点的内容才恢复)), 挂载文件系统使用 mount 命令, 重新挂载使用 remount 命令, 卸载使用 umount 命令.
shell 程序
shell 程序: 提供用户操作系统的一个界面, 可以调用其他软件, 用户通过 shell 程序 (即命令行模式) 来操作这些应用程序, 让这些应用程序调用内核来执行所需的任务. Linux 使用的 shell 版本称为[Bourne Again shell,bash]
用户登录终端 (tty) 时, Linux 系统就分配一个 shell 给用户, 而这个登陆取得的 shell 就记录在 / etc/passwd 这个文件内(默认为 bash).
Bash 的主要优点: 可查看历史命令; 可补齐命令名或文件名; 可给命令设置别名(alias); 任务管理, 前后台控制; 程序化脚本; 通配符用于帮助查询.
~/.bash_history 记录的是前一次登陆所执行过的命令, 而这一次登陆所执行的命令都被缓存在内存中.
你能不能在任何目录下执行某个命令, 与环境变量 PATH 有关, 例如执行 ls 命令时, 如果在查找完 PATH 变量内记录的路径都找不到 ls 这个命令, 就会在屏幕上显示[command not found] .
环境变量: 系统需要一些变量来供他读写数据(或是一些环境的设置参数值, 例如是否要显示彩色等), 所以就需要环境变量来读入系统. 为了区别于自定义变量, 环境变量通常用大写字符表示.
打印变量:[echo $ 变量名] , 变量设置规则: P319
观察环境变量:[env] (打印默认变量),[set] (会打印所有变量)
美元符号 $ 本身也是一个变量, 代表目前这个 shell 的进程号(PID).
子进程: 当用户登录 Linux 获得一个 bash 后, bash 就是一个独立的进程, 这个进程的识别使用的是进程标识符(PID). 接下来在这个 bash 下所执行的任何命令都是由这个 bash 所衍生的, 那些被执行的命令就被称为子进程(所以说 bash 跟其他命令一样是 Linux 系统进程而已, bash 并不是 Linux 系统, 只是 bash 替我们调用其他命令(进程)). 子进程仅会继承父进程的环境变量而不会继承的自定义变量(除非用 export 命令将自定义变量变成环境变量), 所以在 bash 中的自定义变量在进入子进程后会消失, 知道子进程调用完毕回到 bash.
读取来自键盘输入的变量:[read] (常用于 shell 脚本编写中). 变量类型默认为字符串, 声明变量类型:[declare] [typeset]
由于 Linux 可多个用户同时登录, 所以要限制每个用户的某些系统资源(如可以开启的文件数量, 可使用的 CPU 时间, 可使用的内存总量):[ulimit] , 有时候我们某些操作失败(如创建一个大容量文件失败), 很可能是被 ulimit 限制了.
路径与命令的查找顺序:
以相对 / 绝对路径执行命令, 例如[/bin/ls] 或[./ls] ;
由 alias 查找执行;
由 bash 内置 (builtin) 的命令查找执行;
通过 $PATH 这个变量的顺序查找到的第一个命令来执行.
为什么我们什么操作都没做, 而一进入 bash 就能获得一堆有用的变量? 因为系统有一些环境配置文件的存在: 全局系统配置文件, 用户个人偏好配置文件. 我们自行定义的变量, 别名等, 在注销 bash 之后会失效, 想要保住它就要将它写入配置文件, 一般而言 login shell 只会读取这两个配置文件:
/etc/profile: 系统整体的设置(如 PATH,MAIL,USER,HISTSIZE,umask 等), 每个用户登录 bash 时一定会读取, 所以若要改所有用户的环境设置就改这里, 最好不要改这个文件;
~/.bash_profile 或~/.bash_login 或~/.profile: 属于用户个人设置, 只要添加自己的数据就会写入这里, 只会读取三个文件中的一个.
由于上面两个配置文件都是在取得 login shell 的时候才会去读取, 所以在设置好上面两个文件后需要注销再登录才能生效? 如果想直接生效: 用[source] 命令.
除了上面提到的两个配置文件外, 还有其他的配置文件: etc/man_db.conf, ~/.bash_logout, ~/.bash_history
终端环境设置:[stty] [set] (例如设置用哪个按键来作为删除键)
标准输出中,>: 覆盖写入;>>: 追加. 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 同样的文件中
标准输入中,<: 表示将原本需要由键盘输入的改为由指定文件内容输入.
例如: cat> catfile < ~/.bashrc # 原本 cat 默认由键盘输入, 现在由~/.bashrc 文件的内容作为输入, 输入到 catfile 文件中
标准输入中,<< xxx 表示 xxx 作为结束输入的标志.
命令行中若一个命令执行成功则会返回 0, 即 $?(命令返回值)=0, 可以使用类似逻辑判断的语法:
- cmd1 && cmd2 #若 cmd1 正确执行 ($?=0) 则开始执行 cmd2, 否则不执行 cmd2;
- cmd1 || cmd2 #若 cmd1 正确执行, 则 cmd2 不执行, 否则执行 cmd2.
逻辑判断式的结果是向右传递的, 例如:
A && B || C # 若 A 返回失败($? 不为 0), 则不执行 B, 错误结果继续向右传递, 因此执行 C; 若 A 返回成功, 则执行 B, 若 B 也成功则执行 C, 否则不执行.
使用管道 (|) 的命令必须能够接受标准输入的数据(有些命令不支持管道, 可以用 args 命令).
来源: http://www.bubuko.com/infodetail-3652020.html