学习自 鸟哥的linux私房菜
计算机的定义: 接受使用者输入指令与资料,经由中央处理器的数学与逻辑单元运算处理后,以产生或储存成有用的资讯。
CPU内部的微指令集:精简指令集RISC 复杂指令集CISC
1 Byte = 8 bits
桥接器:沟通晶片组
北桥:负责连接速度较快的CPU、主记忆体与显示卡界面等元件
南桥:负责连接速度较慢的装置介面,包括硬碟、USB、网路卡等等。
目前大多将北桥记忆体控制器整合到CPU封装当中了。
时脉:CPU每秒可以进行的工作次数。时脉越高表示这颗CPU单位时间内可以做更多的事情。时脉仅能用来表示同款CPU的速度。
外频指的是CPU与外部元件进行资料传输时的速度,倍频是CPU内部用来加速工作效能的一个倍速,两者相乘才是CPU的时脉速度。
CPU所用的资料都是来自于主记忆体,不论是程序还是资料都必须要读入主记忆体后CPU才能利用。个人电脑的主记忆体主要元件为动态随机存取记忆体(DRAM),断电资料消失。
扇区(Sector)为最小的物理储存单位,每个扇区为 512 bytes;
将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位。
第一个扇区最重要,里面有:(1)主要启动区(Master boot record, MBR)及分割表(partition table)
软件:系统软件和应用软件
高级语言-》编译器-》机器码
操作系统:也是一组程序,这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件。(核心与其提供的介面工具,核心管理硬件,介面工具提供给使用者使用)
Unix 用C语言写成的
早期Linux系统为了相容于Windows的磁碟,使用的是支援Windows的MBR的方式来处理开机管理程序与分割表。而开机管理程序记录区与分割表则通通放在第一个磁区,通常是512bytes的大小,所以说第一个磁区的512bytes通常会有这两个资料:
主要开机记录区:可以安装开机管理程序的地方,有446bytes
分割表 :记录整颗硬碟分割的状态,有64bytes
硬碟的分割实际是对第一磁区分割表的设定。
硬碟预设的分割表仅能写入四组分割资讯,称为主要或延伸分割槽。
分割槽的最小单位通常为磁柱。
设上面的硬碟装置档名为/dev/sda时,那么这四个分割槽在Linux系统中的装置档名为:
P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4
在Windows中,这四个分割槽就是你的CDEF盘
P1为主要分割,P2为延伸分割,延伸分割的目的是使用额外的磁区来记录分割资讯,延伸分割本身并不能被拿来格式化。可以透过延伸分割所指向的那个区块继续作分割的记录。
上图分割槽的命名:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
(sda3和sda4是留给P3和P4的)
MBR分割表的限制:
作业系统无法抓取到2.2T以上的磁碟容量
MBR仅有一个区块,若被破坏后,经常无法或很难救援
MBR内的存放开机管理程序的区块仅446bytes,无法容纳较多的程序码。
GPT磁碟分割表
为了相容于所有的磁碟,在磁区的定义上面大多会使用所谓的逻辑区块位址LBA来处理。GPT将磁碟所有区块以LBA(预设为512bytes)来规划,第一个LBA成为LBA0。MBR仅使用第一个512bytes区块来记录,GPT使用34个LBA区块来记录分割表。MBR第一个512bytes区块被破坏,分割信息就不存在,GPT除了前面34个LBA外,整个磁碟的最后33个LBA也作为分割资讯的备份。
LBA0(MBR相容区块):存放第一阶段的开机管理程序和一个特殊标志表示此磁碟为GPT格式。
LBA1(GPT表头记录):记录了分割表本身的位置与大小,同时记录了备份用的GPT分割放置的位置,同时放置了分割表的检验机制码(CRC32),操作系统通过检验码判断GPT是否正确,若错误则还可以通过这个记录区取得备份的GPT来恢复GPT的正常运作。
LBA2-33(实际记录分割资讯处):从LBA2开始,每个LBA可以记录四个分割记录,432=128个记录,每个LBA512bytes,所以每个记录128bytes。除了每个记录所需要的识别码与相关的记录外,GPT在每个记录中分别提供了64bits来记录开始/结束的磁区号码。因此GPT分割表对于单个分割槽来说,最大容量在2^64512bytes=2^33TB=8ZB。容量非常大。
BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
MBR:第一个可开机装置的第一个磁区内的主要开机记录去区块,内含开机管理程序;
开机管理程序:一支可读取核心档案来执行的软件;
核心档案:开始操作系统的功能。
开机时BIOS依据使用者的设定去读取可开机的硬碟,并且到该硬碟里面去读取第一个磁区的MBR的位置,MBR里面的开机管理程序载入核心档案,核心档案开始操作系统的功能。
先安装Windows再安装Linux
BIOS不懂GPT,需要透过GPT提供相容模式才能够读写这个硬碟装置,而且BIOS在与新的操作系统接轨方面有点弱,于是有了UEFI代替BIOS。
命令 选项 参数1 参数2
linux中区分大小写
echo $LANG 查看目前的语系
date 显示日期与时间的命令
cal 显示日历的命令
bc 简单好用的计算器
加减乘除求余,除法取整数,scale=n输出n位小数点,quit退出计算器
tab键接在一串命令的第一个字的后面,则为命令补全
tab键接在一串命令的第二个字的后面,则为文件补齐
ctrl+c 终止正在运行中的命令
ctrl+d 离开文字接口,退出正在输入,相当于exit
man 【命令名称】:呼出man page,可以在里面查询命令的用法和相关的参数说明。空格翻页,q退出man page
man page第一行DATE后面括号里面的数字的含义:
文本编辑器:nano
命令: nano 文件名 (可以新建或者打开一个文本)
eg:nano text.txt
查看目前有谁在线:who
查看网络的联机状态:netstat -a
查看后台运行的程序:ps -aux
数据同步写入磁盘:sync
在linux系统中,为了加快数据的读取速度,在默认情况中,某些已经加载到内存中的数据将不会直接被写回硬盘中,而是先缓存在内存当中,如果一个数据被重复的改写,就可以直接从内存中读取而不需要先从硬盘中加载到内存中,这样就加快了读写的速度,但是如果遇到意外情况关机,数据由于未写入硬盘就会导致数据的丢失。所以在关机之前应该要使用sync命令对数据写入磁盘。
关机命令:shutdown
reboot,halt,poweroff都能狗关机或者重启
linux共有七种运行等级,其中四种:
使用init n(运行等级的数字)切换各模式
使用者、群组、其他人
文件拥有者(使用者)才能读写文件,其他人不是使用者就不能操作这个文件
群组:群组里的使用者对群组里的文件有使用权,群组外的其他人对该群组没有使用权。
每个账号都可以有多个群组的支持。
root有权限操作任何文件。
默认情况下,系统上的账号与一般身份使用者和root的相关信息,都是记录在/etc/passwd这个文件内的,个人的密码记录在/etc/shadow文件,linux所有的组名都记录在/etc/group内,这三个文件是linux系统里面账号、密码、群组信息的集中地。
ls -al :显示文件的文件名和相关属性
第一列:文件类型与权限
eg:-rwxr--r--
十位数,第一位代表文件类型:
第二、三、四位是文件拥有者的权限,按照rwx的位置排列,没有对应的权限用“-”代替。
第五、六、七位是文件所属群组的权限,位置同上。
第八、九、十位是其他人的权限,同上。
权限对文件的意义:
r(read):可读取此文件的实际内容,如读取文本文件的文字内容等;
w (write): 可以编辑、新增、修改该文件的内容(不包含删除该文件)(删除文件是目录对文件的w权限)
x(execute): 该文件具有可以被系统执行的权限。可以被执行不代表能够执行成功。(windows系统根据后缀名判断是否可执行文件,而linux系统是根据是否有x权限 )
权限对目录的意义:
r(read contents in directory): 具有读取目录结构列表的权限,拥有这个权限就可以利用ls指令将该目录的内容列表显示出来。
w(modify contents of directory): 在该目录中建立新的文件与目录,删除已经存在的文件与目录(和要删除的文件与目录的权限无关),修改里面文件或目录的名称,搬移目录内文件目录的位置。
x(access directory): 代表用户能否进入该目录成为工作目录。
第二列:连结数 表示有多少档名连结到此节点
第三列:文件拥有者
第四列:文件所属群组
第五列:文件大小,默认单位bytes
第六列:文件最后被修改的时间
第七列:文件名
linux文件权限重要性:(安全性)
系统保护功能
团队开发软件或数据共享功能
chgrp:改变文件所属群组
格式:chgrp -R group(群组) dirname/filename(要修改的文件)
chown:改变文件拥有者
格式:chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:组名(同时修改拥有者和所属群组) 文件或目录
chmod:改变文件的权限
数字类型改变文件权限:r:4 w:2 x:1
如果权限为rwxrwx---,owner=rwx=4+2+1=7,group=rwx=4+2+1=7,others=0+0+0=0,所以权限值为770,所以变更权限格式为:chmod [-R] 权限值 文件或目录
符号类型改变文件权限:
u(user),g(group),o(others),a(all),+(加入),-(除去),=(设定)
eg:chmod u=rwx,go=rx test.txt(设置test.txt的user权限为rwx,group和others权限为rx)
eg:chmod a-x test.txt(设置test.txt的所有即user、group和others的原有权限去掉x权限)
关于linux下 chmod 修改文件权限不生效的问题:
http://forum.ubuntu.org.cn/viewtopic.php?t=395668
可见test2目录的权限并未改变,因为该目录不是linux分区下的目录
下面修改了linux分区中的一个目录的权限:
修改后权限发生改变:
linux文件种类:正规文件(纯文本、二进制、数据文件)、目录、连结档、设备与装置文件、数据接口文件、数据输送文件
linux文件长度限制
单一文件或目录的最大容许文件名为255个字符
包含完整路径名称及目录的完整文件名为4096个字符
linux文件名限制:避免特殊字符 * ? > < ; & ! [ ] | \ ' " ` ( ) { } . - +
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录(刚才使用过的目录)
~ 代表目前使用者身份所在的家目录
~account 代表account这个使用者的家目录
cd 变换目录
cd ~cjh: 去到cjh这个使用者的家目录 /home/cjh
cd ~ : 回到当前使用者自己的家目录
cd: 不加路径,代表回到使用者自己的家目录
cd .. : 回到上级目录
cd - : 回到刚才的目录
cd 绝对路径
cd 相对路径
pwd (显示目前所在的目录)
pwd -P 显示出实际工作目录,而不是连结档目录
mkdir 目录名称: 在当前目录下创建某目录
mkdir -p 多级目录名称: 递归创建多级目录
mkdir -m 权限值 目录名称:创建目录的时候同时修改权限值而不是使用默认的权限值
rmdir 目录名称:删除空目录,如果目录下非空,删除不成干
rmdir -p 多级目录名称:递归删除多级空目录
echo $PATH 列出环境变量
运行命令时,系统会依照PATH的配置去每个PATH定义的目录下搜寻名字为该变量的可运行档,如果有多个可运行档,先搜寻到的同名命令先执行。
不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同,使用echo $PATH打印出来的环境变量也不同。
PATH是可以修改的。
可以使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确。
本目录(.)最好不要放到PATH当中。
文件内容查阅
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 以二进位的方式读取文件内容
umask:设定创建文件或目录时的初始权限
数字的含义,从默认权限中拿掉的权限
002代表不拿掉使用者任何权限,不拿掉群组的任何权限,拿掉其他人的w权限,所以对于新建的文件,从rw-rw-rw-拿掉002权限后变为rw-rw-r--,对于新建的目录,从rwxrwxrwx拿掉002权限后变为rwxrwxr-x
文件特殊权限:SUID,SGID,SBIT
SUID/SGID/SBIT权限配置:4为suid,2为sgid,1为sbit
which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令就不一样。
cd 是『bash 内建的命令』,which 默认是找 PATH 内所规范的目录,所以找不到cd
whereis 与 locate 是利用数据库来搜寻文件,所以相当的快速,而且并没有实际的搜寻硬盘, 比较省时间,find是实际在硬盘中搜寻。
Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者 locate 时,都会以此数据库文件的内容为准, 数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』因为必须要升级数据库。因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件,这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在。可以通过updatedb命令手动升级数据库。
文件系统特性
因为每种操作系统所配置的文件属性/权限并不相同, 为了存放这些文件所需的数据,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』。
windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2
较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block 。
linux的索引式文件系统:
假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来! 那么数据的读取就如同下图中的箭头所指定的模样了。
闪盘使用的文件系统一般为 FAT 格式。FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中, 他的读取方式有点像底下这样:
这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!
碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易。
Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。
原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
每个 block 内最多只能够放置一个文件的数据;
承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
inode 记录的文件数据至少有底下这些:
该文件的存取模式(read/write/excute);
该文件的拥有者与群组(owner/group);
该文件的容量;
该文件创建或状态改变的时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义文件特性的旗标(flag),如 SetUID...;
该文件真正内容的指向 (pointer);
每个 inode 大小均固定为 128 bytes;
每个文件都仅会占用一个 inode 而已;
承上,因此文件系统能够创建的文件数量与 inode 的数量有关;
系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
系统将 inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。
Superblock (超级区块):记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。记录的信息主要有:
block 与 inode 的总量;
未使用与已使用的 inode / block 数量;
block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
每个 block group 都可能含有 superblock,除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份。
Filesystem Description (文件系统描述说明):描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。
block bitmap (区块对照表):记录的是使用与未使用的 block 号码,在新增或删除文件时管理block区块的信息。
inode bitmap (inode 对照表):记录使用与未使用的 inode 号码。
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
实体链接(Hard Link):
实体链接和原文件拥有同一个inode,权限和属性也一模一样;
为某一个文件增加一个实体链接,原文件和实体链接的link数目都加一;
无论是删除了原文件或者是实体链接中的任何一个,另一个还能正常访问;
修改任何一个两者也同时修改;
增加一个实体链接不会消耗inode和block的数量;
实体链接不能跨文件系统,也不能用在目录上。
符号链接(symbol link):
类型windows的快捷方式;
符号链接创建了一个新的文件,这个文件会让数据的读取连结向原文件;
来源档被删除后,符号链接无法访问;
增加符号链接后,原文件的link数加一,但是符号链接的link数不会加一;
对符号链接目录中的文件进行删除新建等操作,实际上是在原目录中删除和新建;
符号链接会占用inode和block。
fdisk 磁盘分区有关
mkfs 磁盘格式化有关
fsck 磁盘检查有关
mount,umount 磁盘挂载有关
linux压缩和解压缩:
compress,uncompress
gzip,zcat,gzip -d
bzip2,bzcat,bzip2 -d
linux打包:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称 //打包并压缩为bz2
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
把上面的j参数换成z参数就是gzip的
dump备份,restore还原