Linux基础(二)

来源:互联网 发布:淘宝助理菜鸟模板设置 编辑:程序博客网 时间:2024/05/19 02:28

{,  #464}磁盘的第一个扇区主要记录了两个方面的信息:

主要启动记录区和分割表(MBR),可以安装开机管理程序(446字节);分割表记录整个硬盘的分割状态,占64字节,因此最多只能有四个主分区和扩展分区。所谓磁盘的分割就是对这64字节的分割表进行设定,分割槽的最小分割单位是磁柱

MBR很重要,因为在系统开机的时候会主动去读取MBR的内容,这样系统才能找到系统并开机。

MBR:

简单的说,整个开机流程到操作系统之前的动作是这样的:

1.BIOS:开机主动执行的韧体,会认识第一个可开机执行的装置。

2.MBR:第一个可开机装置中的第一个扇区内的主要启动记录区块,内有开机管理程序

3.开机管理程序(boot loader):一只可读核心档案的软件,在安装操作系统的时候装入。

4.核心档案:开始操作系统的功能

开机管理程序的主要任务(boot loader):

1.提供选单:用户可以选择不同的项目,这是多重引导的重要功能

2.转入核心档案:直接指向可开机的程序区段开始操作系统程序

3.转交给其他loader:将开机管理功能转交给其他loader负责(开机管理程序除了可以安装在MBR之外,还可以安装在每个分割槽的启动扇区(boot sector),这个特色造就了多重引导的功能)

Linux系统的开机过程:

BIOS-->MBR-->BOOT LOADER-->系统核心档案

Boot loader的功能主要有:提供选单、加载核心、转交控制权给其他loader,Boot Loader可以安装的主要地方有两个,一个是MBR,另外一个是Boot Sector。

SELinux是一个Linux系统讵问控制(Accesscontrol)的绅部讴定, 重点在于控制程序对于系统档案的讵问权限限制。

Kdump就是,当核心出现错误的时候,是否要将当时的内存内的讯息写到档案中,而这个档案就能够给核心开发者研究为啥会当机时用。 我们并不是核心开发者,而且内存内的数据实在太大了,Kdump会造成硬盘空间的浪费。 所以,这里建议不要开启Kdump的功能。

根目录:

根目录与开机过程有关,在开机过程中根目录会被挂载,其他的目录只有在开机完成后才能被挂载,因此与开机过程有关的目录,只能放在根目录下而不能放在其他的目录下。

/etc配置文件;/bin重要执行档(与开机过程有关);/dev所需要的档案装置;/lib:执行档所需的函式库和核心所需的模块(如驱动程序);/sbin:重要的系统执行文件

/bin主要放置开机时或者进入单人模式后还能被运行的指令,usr/bin主要放置软件提供的指令。/bin放置的是一般用户使用的指令,/sbin主要是系统管理员使用的指令,不过/bin和/sbin都与开机,单人模式有关。

要想复制别人的文件,必须要有读权限。

当没有加任何选项时,CP复制的是源文件而不是链接文件。复制时,一般用户的身份并不能修改档案的拥有者和群组,因此与拥有者和群组相关的,一般用户无法进行的操作,在复制时即便加上 cp  --a 也无法进行拥有者和群组的修改。

档案时间:

Mtime:当档案的内容数据变更时,就会更改此时间。内容数据指的是档案的内容,而不是档案的权限或者属性。

Ctime:当档案的状态变更时,就会更改此时间,就像属性或者权限变更时,就会更改这个时间。

Atime:当档案的内容被取用,也就是档案内容被调入到内存时,会更改这个时间参数。举例来说,就是当使用CAT指令去查看某档案的内容时,该档案的access time(atime)就会改变。指令之间可以使用分号隔离,表示批量执行指令。

SUID权限:

Suid仅对二进制程序有效;

执行者对于该档案具有可执行的权限;

该权限仅在程序的执行过程中有效;

执行者在程序执行过程中具有该程序拥有者的权限。

例如:

1.vbird对于usr/bin/passwd这个程序具有X权限,表示vbird能执行passwd;

2.Passwd程序的拥有者是root帐号

3.Vbird在执行passwd过程中,暂时获得了root的权限

4./etc/shadow就可以被vbird所执行的passwd程序修改

增加和查看档案特殊属性的指令:chattr , lsattr

SGID:

当s标志在档案拥有者的x项目为SUID,那s出现在群组的X项时为SGID,

与SUID不同的是,SGID可以针对档案或者目录来设定,如果是对档案来说,SGID有如下的功能:

1.SGID对二进制程序有用;

2.程序执行者对于改程序来说,需具备x的权限;

3.执行者在执行的过程中将会获得该程序群组的支持;

除了二进制程序之外,SGID也能用在目录上,这也是非常常见的一种用途,目录设定了SGID权限后,他将具有如下的功能。

用户若是对此目录具有读和写的权限,该用户能进入此目录;

用户在此目录下的群组将会变成此目录的有效群组;

用途:若是用户在此目录下具有写的权限,则使用者所建立的新档案,该新档案的群组与该目录的群组相同。

SBIT:了解

增删档案或者目录的SUID,SGID,SBIT的属性:chmod 4 2 1

观察文件类型:file

WHICH:查找指令的指令:

Which指令根据PATH的设定顺序来搜寻指令所在的位置,用户不同,PATH变量不同,搜寻的结果也不相同。

Whereis,locate,find

Whereis和locate是通过数据库来搜寻数据,并没有实际搜寻硬盘,省时间。Find是通过搜寻硬盘来达到目的,肯定能找到,但是比较费时间。

因为linux系统会将系统内所有档案名称都记录在一个数据库中,使用whereis或者locate都是查询这个数据库,数据库的建立一般是每天更新,所有会有延迟,使用updatedb命令能更新数据库。

增加组:groupadd 增加用户:useradd

文件系统:

每个inode和block都有各自的编号。

Superblock:记录此filesystem的整体信息,包括inode/block的总体量,使用量,剩余量以及系统的格式等相关的信息;

Inode:记录档案的属性,同时记录此档案的数据所在的block的号码;

Block:实际存放档案的数据,若是档案数据太大,则会存放在多个block中。

在整体规划中,文件系统最前端有一个引导扇区,这个引导扇区可以安装开机管理程序。这是个非常重要的设计,如此一来我们可以将不同的开机管理程序安装到不同的文件系统的最前端而不用覆盖整颗硬盘唯一的MBR,这样就可以安装多个操作系统了。

Inode记录的数据

1.该档案的存取模式(rwx)

2.该档案的拥有者和群组

3.该档案的容量

4.该档案建立或者状态改变的时间(ctime)

5.最近一次的读取时间(atime)

6.最近修改的时间(mtime)

7.该档案内容的存储区块

8.该档案的特性标志(suid,sgid,sbit)

Superblock:

Superblock是记录整个filesystem相关的,没有superblock,就没有这个文件系统。他记录的主要信息有:

1.Inode和block的总量和未使用的数量

2.Block和inode的大小(block为1,2,4k,inode为128字节)

3.Filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息

4.一个valid bit数值,若是文件系统已经被挂载,则valid bit为0,否则为1。

此外,每个blockgroup都可能含有superblock,但是我们也说一个文件系统仅有一个superblock。事实上除了第一个block group内会含有superblock之外,后续的block group不一定含有superblock,而若是含有superblock也主要是为第一个superblock备份,用作救援。

Block bitmap(区块对照表)

当新增档案需要分配Block时使用,同样要删除某些档案时,原本这些档案占用的block号码就需要释放出来

Inode bitmap(inode对照表)

功能和blockbitmap相同

每个区段和superblock的信息都可以使用dumpe2fs指令来查询。df指令可以叫出目前挂载的装置。

目录:

在linux系统下,每个档案都会占用一个inode(不管是目录档案还是一般档案),且可以根据档案内容的大小来分配多个block给档案使用。目录的内容是在记录文件名,一般档案的实际内容是记录数据内容的地方。

当我们在linux系统下的ext2文件系统下建立一个目录时,ext2会分配一个inode与至少一块block给目录。其中inode记录该目录的相关权限和属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名所对应的文件占用的inode号码。

目录的inode本身并不记录文件名,文件名的记录在block当中,因此才会提到新增/删除/更改文件名与目录的w权限相关。

由于目录树是从根目录开始读起,因此系统透过挂载的信息可以找到挂载点的inode号码,此时就能够读到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层一层的往下读到正确的档案名。

新增档案文件系统的行为:

1.先确定用户对于欲新增的目录是否具有w和x的权限,若是有的话才能新增。

2.根据inode bitmap找到没有使用的inode号码,并将新档案的权限/属性写入。

3.根据block bitmap找到没有使用中的block号码,并将实际的数据写入block中,且更新inode的block指向数据。

4.将刚刚写入的inode与block数据同步更新inode bitmap与block bitmap,并跟新superblock的内容。

Linux支持的文件系统

传统的文件系统:ext2/minix/MS_DOS/FAT(用vfat模块)/iso9660(光盘)等

日志式文件系统:ext3/ReiserFS/windowsNTFS/IBM JFS/SGI XFS

网络文件系统:NFS/SMBFS

Linux VFS(Virtual Filesystem Switch)

Linux的系统都是透过VFS的核心功能去读取filesystem的,也就是说,整个linux认识的filesystem其实都是VFS在进行管理,我们使用者并不知道partition上头的filesystem是什么,VFS会主动的帮助我们做好读取的工作。

假设你的/使用的是/dev/hda1,用ext3,而/home使用的是/dev/hda2,用reiserfs,VFS帮助我们省去了自行设定读取文件系统的定义。

Df:列出文件系统的整体磁盘使用量

Df不含任何参数时默认将系统内的所有文件系统名字都列出来(不含内存内的特殊文件系统),加参数-a时将内存内的文件系统都列出来。由于df主要读取的数据几乎都是针对一整个文件系统的,因此读取的范围主要是在superblock内的信息,所以这个指令的速度非常快。另外,如果使用-a这个参数时,系统会出现/proc这个挂载点,但是里面的东西都是0。/prco的东西都是linux系统所需要加载的系统数据,而且是挂载在内存中的,所以没有加载任何的硬盘空间。

Du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

查看某一目录下各个文件占用的磁盘空间

硬连接和符号连接:(ln命令)

在linux系统下的连接档有两种,一种是类似Windows的快捷方式功能的档案,可以让你快速的链接到目标档案或目录;另一种是透过文件系统的inode连接来产生新档案名称,而不是产生新档案,这种称为实体连接。

一般来说,使用硬连接设定链接文件时,磁盘的空间和inode的数量都是不会改变的,因为硬连接只是在某个目录下的block中多写入一个关联数据而已,既不会增加inode的数量也不会消耗block的数量。事实上,hard link只能在单一文件系统中进行,不能够跨文件系统,也不能连接到目录。

符号连接就是在建立一个独立的档案,而这个档案会让数据的读取指向他连接的那个档案的档名,由于只是利用档案来作为指向的动作,当来源档案被删除之后,符号连接的档案就会开不了。

硬连接比较安全,因为即使某一个目录下的关联数据被杀掉(也就是目录所指向的block中有关该文件的项被删掉了),也没有关系,只要有任何一个目录下存在着有关数据,那么该档案就不会不见。

格式化指令:mkfs  mke2fs

检查文件系统是否有错误:fsck

检查是否损坏:badblocks

系统挂载注意事项:

单一文件系统不应该被重复挂载在不同的挂载点目录中;

但一目录不应该重复挂载多个文件系统;

要作为挂载点的目录,理论上应该都是空目录。

Mknod:

在linux底下所有的装置都是通过档案来代表的,就是透过档案的major和minor的数值来替代的。

E2label:改变装置的名称

Tune2fs

使用实体分割槽建置swap

1.分割:先使用fdisk在磁盘中分隔出一个分割槽给系统作为swap。由于linux的fdisk预设会将分割槽的id设定为linux的文件系统,所以还要设定下system ID。

2.格式化:利用swap格式的mkswap装置文件名,就能格式化该分割槽成为swap格式了。

3.使用:最后将swap装置启动,swapon命令

4.观察:使用free这个指令观察内存的使用量

5.在更改完分区后,需要使用partprobe指令让核心更新partition table

Superblock和boot sector:

Superblock的大小为1024bytes;

Superblock的前面需要保留1024bytes下来,以让开机管理程序安装

如果block大于1024的话,那么superblock将会在0号,superblock其实就只有1024bytes,为了不浪费空间,第一个block中就含有boot sector和superblock两者。0-1023字节保留给boot sector使用。

磁盘的使用必须要经过:分割,格式化和挂载,惯用的指令为:fdisk,mkfs,mount三个指令。

情境模拟题:

由于我的系统原本分割的不好,我希望能够独立一个filesystem附挂在/srv/myproject目录下。并且能让这个filesystem每次开机都能够自动的挂载到该目录下面,且该目录是给project这个群组共享的,其他人不具有任何权限,且该filesystem具有5GB的容量。

1.首先,我们必须要使用fdisk来建立新的分区

2.为避免重新启动,因此使用partbrobe强制核心更新分割表

3.建立分区后,进行格式化动作 mkfs

4.建立挂载点 mkdir /srv/myproject

5.编写自动挂载的配置文件 nano /etc/fstab,在这个档案底下新增一行

6.测试自动挂载 mount -a

7.设定最后的权限

Mkisofs  cdrecord

寻找刻录机:cdrecord -scanbus dev=ATA

Dd指令

Tar可以用来备份关键数据,而dd则可以用来备份整颗partion或整颗disk。使用dd指令,新分割出来的partion不需要进行格式化,因为dd可以将原本旧的partition上面,将sector表面的数据复制过来。连同superblock,boot sector,meta data等等全部也会复制过来。若是想要建两颗完全相同的磁盘,就可以使用这个指令。

Cpio指令可以备份任何的档案

开机管理程序grub(linux操作系统之奥秘)

Stage1这一步是grub中不可或缺的,主要负责bios交接给grub时,载入存在于各分区中的开机文件,也就是所谓的开机管理程序,/boot/grub/stage1文件就是MBR中bootloder的备份文件,或者说是管理程序的备份文件。

stage1.5 文件,如 e2fs_stage1_5、fat_stage1_5、jfs_stage1_5 和reiserfs_stage1_5,这些都属于 stage 1.5 阶段功能的文件,其作用就像是连接 stage1 到 stage2 的一个信道,里面唯一存放着的是该系统文件的格式。

Stage2这个文件是 GRUB 的核心程序,能让用户以选项方式将操作系统加载、新增参数、修改选项,这些全都是 stage2 的功能。对 GRUB 来说,stage2 除了不能自己激活外,剩下的事情全被 stage2 包了。stage2 文件存放在各分区的 Bootsector 中,主要的功能如下:

1.提供选项。

2.访问设置文件。

3.连接下一个 boot sector。

既然stage2是专门负责开机选项和kernel的位置的部分,假设有多个操作系统时(每个操作系统都需要支持多重开机),其他的操作系统在该分区是不需要有这三个stage中的任何一个的。因为只要有一个主要开机用的操作系统所含的stage1,加上协助加载kernel的stage2,就可以知道所有操作系统的kernel存放的位置,以便让多重开机管理系统,加载目前已经安装在各个分区中的操作系统。

Shell模式下的grub:

A:将系统分区指向第一块硬盘的第三个分区(对应方式请参考第 2.2 节“GRUB 的设置方

式”)。

B:准备安装 GRUB 至MBR。

C:将 stage1 部分资料安装至 MBR 的 bootloader 空间。

D:将stage1.5 的文件(在这里为 e2fs_stage1_5)写入MBR 后的 15 个扇区,扇区数目会因文件系统格式的不同而有差异,因为所对应的 stage1.5 的文件不同。扇区数目的算法如下:范例中的 e2fs_stage1_5 文件大小为7 616 Byte,每 512 Byte 为一个扇区,因此,需要 7 616 / 512=14.875 个扇区,但文件系统中的扇区是以区块方式分发的,不能零散地使用,因此,要用到 15个扇区。

E:告知 bootloader,当需要加载 stage2 时,其位置在第一块硬盘的第三个 partition 的

/boot/grub 目录下。

F:将 grub.conf 设置文件的位置直接告知stage2。

GRUB 与开机顺序的关系

① BIOS 将控制权交给硬盘的主引导区,MBR。

② MBR 中的 bootloader 通过内置的地址加载stage1.5。

③ bootloader 通过 stage1.5 内容,将分区中的stage2 加载。

④ stage2 此时就可以在文件系统中将 grub.conf 设置文件加载,让用户看到选项画面。

这就是 GRUB 让用户看到开机选项画面,并将操作系统加载的方式,接下来看 GRUB 的设置,以决定开机的方式。

开机选项:

开机选项代表每一个操作系统的设置值,其中每个操作系统的区域各有不同的设置,主要分成 4 个部分:

1.title

操作系统的名称,可以自行设置。

2.root

定义该操作系统所使用的 kernel 及 initrd 文件是存放在哪一块硬盘中的,在这里要用 hd(x,x)的格式注明,所以 hd(0,0)代表的是第一块硬盘的第一个分区。请记住,Linux 下很多的编号都是从 0 开始的,如果设错,便无法加载 kernel。

3.kernel

加载 kernel 的位置,当 kernel 被成功加载后,会再检查后方紧接着的 root 参数是哪一个分区,将该分区mount(Linux 下将设备链接到目录的指令)设置为“/”。 所以,虽然 hd(0,0)与/dev/sda1 是指到同样一个分区,但选项中的第一行 hd(0,0)是提供给 stage2 加载 kernel 用的;kernel 中的 root 参数则是提供加载kernel 后,使其找到“/”分区,所以其实际的意义不同,且不能省略。在 kernel 参数的最后可以加上开机时要先行加载的核心参数,比如 singlemode 或其他的参数

在程序执行过程中,使用ctrl+z的组合键可以让该程序后台执行。

Vim使用手册

 

中文编码的问题:

中文编码有big5和utf8两种,如果你的档案是使用big5制作的,但是vim的终端接口中你使用的是万国码(utf8),由于编码的不通,你得中文档案可能是乱码。这需要考虑很多问题:

1.你的linux系统默认支持的语系数据:这个与/etc/sysconfig/i18n有关

2.你的终端界面bash的语系:这个和LANG这个变量有关

3.你的档案原来的编码

4.开启终端的软件,例如在grome底下的窗口接口。

事实上最重要的是上头的第三点和第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的档案,否则将会看到一堆乱码。

DOS和Linux换行符的不同:

Windows下的换行符为回车和换行,Linux下的换行符就是回车。在linux底下的指令在开始执行时,他的判断依据是Enter,而linux下的Enter为回车,而Windows下的换行键是回车换行。这样的情况下,如果是一个shell scripts的程序档案,可能会造成程序无法执行的状态,因为他会误判程序所下达的指令内容。

Linux和Windows下格式转换(其实就是转换回车键)

dos2unix指令和unix2dos指令

语系编码转换:

举例来说,想要将big5转换成utf8。使用iconv这个指令即可。这个指令支持的语系非常多,除了中文的big5和utf8编码之外,也可以支持简体中文的国标2312.

Shell

为什么我妈系统上合法的shell要写入/etc/shells这个档案?这是因为系统某些服务在运作过程中,回去检查使用者能够使用的shell,而这些shell的查询是借由/etc/shells这个档案来实现的。

举例来说,某些FTP网站回去检查使用者的可用的shell,而如果你不想要让这些用户使用FTP以外的主机资源时,可能会给予使用者一些怪怪的shell,让使用者无法以其他服务登录主机。举例来说,CentOS 5,X的/etc/shells里头就有个/sbin/nologin档案的存在,这个就是我们说的怪怪的shell。

命令别名设定功能:alias

使用type指令可以知道每个指令是否是bash的内建指令。它是linux系统的一种自省机制,知道了是哪种类型,我们就可以针对性的获取帮助。比如内建命令可以用help命令来获取帮助,外部命令可以用man或者info来获取帮助。type命令的基本使用方式就是直接跟上命令名字。type -a可以显示所有可能的类型,比如有些命令如pwd是shell内建命令,也可以是外部命令。type -p只返回外部命令的信息,相当于which命令。type -f只返回shell函数的信息。type -t 只返回指定类型的信息。

Tpye也可以用来作为类似which指令的用途,是用来找指令的。

变量的设定规则:

1.变量与变量名以一个等号来连接,中间不能加空格

2.变量名称只能是英文字母与数字,但是开头不能是数字

3.变量内容若是有空格符可使用双引号或者单引号将变量内容结合起来

双引号内的特殊字符如$等,可以保持原本的特性,如下所示:

Var="lang is $LANG",则echo $Var可得lang is en_US

单引号内的特殊字符则仅为一般字符,如下所示:

Var='lang is $LANG',则echo $var可得lang is $LANG

4.可用逃脱字符将特殊字符变成一般字符

5.在一串指令中,还需要借由其他的指令提供的信息,可以用反单引号或者$(指令)。

例如想要取得核心版本的设定:

Version=$(uname -r),再echo $version

6.若变量是为了扩增变量内容时,则可以使用“$变量名称”累加内容,如下所示:

PATH="$PATH":/home/bin

7.若是该变量需要在其他子程序中执行,则需要以export来使变量变成环境变量

如export PATH

8.取消变量的方法为使用unset:例如unsetmyname

子程序

在我目前这个shell的情况下,去启动另外一个新的shell,新的那个shell就是子程序。在一般的状态下,父程序的自定义变量是无法在子程序中使用的,但是透过export将变量变成环境变量之后,就能在子程序中使用了。

反单引号:`

在一串指令中,在`之内的指令将先被执行,而其执行出来的结果将作为外部的输入信息。举个例子:我们知道,locate指令可以列出所有的相关档案档名,但是如果我想知道各个档案的权限呢?举例来说,我想知道每个crontab相关档案的权限:

可以使用ls -l`locate crontab`

环境变量的功能:

环境变量可以帮助我们达到很多的功能,包括家目录的变换,提示字符的显示,执行文件搜索的路径等等。

用env观察环境变量和常见环境变量说明

env是environment的简写,是列出所有的环境变量

$:(关于本shell的PID)

钱字号本身也是个变量,代表的是目前这个shell的线程代号,亦即是所谓的PID。想要知道我们的shell的PID,就可以用echo $$即可,出现的数字就是你得PID号码。

?:(关于上一个执行指令的回传值)

指令执行完后,都会回传一个执行后的代码。如果成功执行的话,则会回传一个零值,如果执行过程发生错误,就会回传错误代码才对,一般就是以非零值来取代。

OSTYPE,HOSTTYPE,MACHTYPE

需要注意的是,较高阶的硬件通常会向下兼容旧有的软件(因为旧有软件需要的指令新硬件都能够提供),但是低阶级的硬件不能安装高阶级的软件,因为低阶级的硬件无法提供高阶级的指令系统。

env和set的区别

两者的差异就是该变量是否会被子程序所继续引用。

当你登录linux并取得一个bash之后,你的bash就是一个独立的程序,被称为PID的就是,接下来你在这个bash底下所下达的任何指令都是这个bash所衍生出来的,那些被下达的指令都是被成为子程序了。我们原本的bash底下执行另一个bash,结果操作的环境接口会跑到第二个bash去,就是子程序,原本的bash就睡着了。子程序只会继承父程序的环境变量,而不会继承父程序的自定义变量。

Export指令

该指令可以让自定义变量变成环境变量。这个指令用在分享自己的变量设定给后来呼叫的档案或者其他程序

将环境变量转换为自定义变量declare

locale指令

查看我们的linux到底支持多少的语系,可以由locale指令查询。

为什么环境变量的数据可以被子程序所引用呢?这是因为内存配置的关系,理论上是这样的:

当启动一个shell,操作系统会分配一个记忆区块给shell使用,此内存内的变量可以让子程序取用,当父程序使用export功能,可以让自定义变量的内容写到上述的记忆区块中(环境变量),当加载另一个shell时(也就是启动了子程序,而离开了原本的父程序),子shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块中。

Read  array  declare

Declare和typeset是一样的功能,都是宣告变量的类型

Unset使声明的变量变成无效的

Bash对于变量有几个基本的定义:

变量类型默认为字符串,所以若是不指定变量类型,则1+2是一个字符串而不是计算式

Bash环境中的数值运算,预设最多仅能到达整数状态,所以1/3结果是0

命令别名:alias unalias

命令的使用历史history

有些人在练习linux的时候喜欢同时开好几个bash窗口,这些bash的身份都是root,这样会有~/.bash_history的写入问题。这些bash同时都是以root的身份登入,因此所有的bash都有自己的1000笔记录在内存中,因为等到注销时才会更新记录文件,所以最后注销的那个bash才会是最后写入的数据。如此以来,其他bash的指令操作就不会被记录下来了(其实是被记录下来的,只是后来的最后一个bash把前面的给覆盖更新了)

路径和指令访问顺序:

指令运作的顺序可以这样看:

1.以相对/绝对路径来执行指令

2.由alias找到该指令来执行

3.由bash内建的指令来执行

4.透过$PATH这个变量的顺序搜寻到的第一个指令来执行

Bash的进站和欢迎信息 /etc/issue ,/etc/motd

终端机接口登录的时候会有这部分信息

指令回传值:$?  && 和 ||

管线命令:

管线命令仅能处理前面一个指令传来的正确信息,也就是标准输出的信息,对于标准错误的输出并没有直接处理的能力。在每个管线后面的第一个指令必须是指令,而且这个指令必须能够接受标准输入的数据才行。例如less,more,head,tail等都是可以接受标准输入的管线命令。至于ls,cp,mv等就不是管线命令了,因为ls,cp,mv并不会接受来自标准输入的数据。

管线命令仅仅会处理标准输出,对于标准错误输出会忽略

管线命令必须能够接受来自前一个指令的数据成为标准输入继续执行才行。

截取命令: cut  grep

就是将一段数据经过分析后,取得我们想要的数据

Cut的主要用途在于将同一行里面的数据进行分解,通常使用在分析一些数据或者是文字数据的时候。

Cut是将一行讯息中,取出我们想要的,而grep则是分析一行讯息,若是当中有我们想要的信息,就将该行拿出来,简单的语法就是这样的:

排序指令:sort wcuniq

双向重导向 tee

Tee会同时将数据流送到档案和屏幕中去。

字符转换命令:tr coljoin paste expand

Tr可以用来删除一段讯息中的文字,或者进行文字讯息的转换

参数代换:xargs

大于号是标准输出 小于号是标准输入(大小对出入)

关于减号 -的用途:

管线命令在bash的连续处理程序中是非常重要的。另外,在log file的分析中也是非常重要的。另外,在管线命令中,常常会使用到前一个指令的stdout作为这次的stdin,某些指令需要用到文件名(例如tar)来进行处理时,该stdin与stdout可以利用减号来替代

SHELL

由于核心在内存中是受保护的区块,因此我们需要透过shell将我们输入的指令和kernel沟通,好让kernel可以控制硬件来正确无误的工作

正规表示法:用在字符串的处理上面的一项表达式,正规表示法并不是一个工具程序,而是一个字符串处理的标准依据,即处理字符串的方法。如果想要以正规表示法的方式处理字符串,就得要使用正规表示法的工具程序才行,这类的工具程序很多,例如vim,sed等等。

正规表示法基本上就是一种表示法,只要工具程序支持这种表示法,那么该工具程序就可以作为正规表示法的字符串处理之用。例如vi,grep,awk,sed等等工具,因为他们支持正规表示法,所以这些工具就可以使用正规表示法的特殊字符来进行字符串的处理,但是例如cp,ls等指令并未支持正规表示法,所以就只能使用bash自己本身的通配符而已。

开机过程的相关程序都是在/etc/init.d/目录下

Dmesg列出核心信息

Sed后面接的动作,必须以两个单引号括住

档案比对工具 diffcmp

同一个软件包的不同版本之间,比较配置文件和原始档案的差距。

Patch:

Patch这个指令和diff有密不可分的关系。Diff可以用来分辨两个版本之间的差异。但是如果要升级呢?就是将旧的档案升级为新的档案,此时需要先比较新旧版本的差异,并将差异制作成补丁档案,再由补丁更新就档案。

Linux系统的服务启动的接口在/etc/init.d这个目录下,目录下的所有档案都是script,另外,包括开机的过程都是利用shell script来帮忙搜索系统的相关设定数据,然后再代入各个服务的设定参数的。举例来说,如果我们想要重新启动系统的注册表,我们可以使用:/etc/init.d/syslogd restart,那个syslogd就是script。

Script的撰写和执行

1.指令的执行是从上到下,从左到右的分析和执行

2.指令、选项和参数间的多个空白都会被忽略

3.空白行会被忽略,并且tab键所推开的空白同样被视为空格键

4.如果读到enter键,就尝试开始执行该串命令

5.如果一行的命令太多,就可以使用\键来延伸到下一行

6.#键可以作为批注,任何加在后面的资料都会被视为批注文字而被忽略

7.Script内所撰写的程序,都会被一行一行的执行

Shell script

指令取得的信息 $(command) 数值的运算$((计算式))

利用直接执行的方式来执行script,该script都会使用一个新的bash环境来执行脚本的指令,script是在子程序的bash内执行的。当子程序执行完之后,在子程序内的各项变量或者动作都会结束而不会传给父程序中。当使用直接执行的方法来处理script时,系统会给予一支新的bash让我们来执行script里面的指令

利用source来执行脚本,在父程序中执行

各种动作都会在原本的bash中生效。这也是为什么你不注销系统而要让某些写入~/.bashrc的设定生效时,需要source ~/.bashrc而不能使用bash ~/.bashrc是一样的道理

利用test指令的测试功能

1.关于某个档名的文件类型的判断

2.关于档案的权限侦测,如是否可读可写

3.两个档案之间的比较

4.关于两个整数之间的判定

5.判定字符串的数据

6.多重的判断条件与或非

[ ]中括号判定

在中括号中的每个组件都必须有空格键来分隔

在中括号中的变量最好都以双引号括起来

在中括号中的常数,最好都以单或双引号括起来

在bash中使用两个等号和一个等号的效果是一样的,两个等号是逻辑判断的意思,因此最好使用在做判断的是时候使用两个等号。

Shift:偏移指令

Shift后面可以接数字,代表拿掉最前面的几个参数的意思

单层、简单条件判断式:

If[ ] then

[]与[]之间可以用&&或者||来连接

Netstat指令:

这个指令可以查询到目前主机有开启的网络服务端口号 netstat-tuln

利用function功能

循环(while do done | until dodone)

Shell script的追踪和debug

sh -nvx script.sh 只检查是否有语法错误,但是并不执行script

用户和群组的关系图

 

Usermod 修改用户帐号的各项设定

Newgroup:有效群组的切换 限制:想要切换的群组必须是已经有支持的群组

私有群组机制和公共群组机制。SHELL:/bin/bash。系统默认的shell就写在这里,假如你得系统为mail server,你希望每个帐号都只能使用mail的收发信件的功能,而不许用户登录系统取得shell,那么可以将这里设定为/sbin/nologin,如此一来,新建的使用者预设就无法登入。

修改密码的各个字段的参数:chage

其实就是修改shadow各栏信息

Usermod指令:可以修改/etc/passwd或/etc/shadow去修改相应字段的数据

/etc/skel是用户家目录的蓝本

删除用户的相关信息:userdel

用户帐号/密码相关参数:/etc/passwd ,/etc/shadow

使用者群组相关参数:/etc/group,/etc/gshadow

用户个人相关参数:/home/username/var/spool/mail/username

使用userdel的前提是你真的确定不要让该用户在主机上使用任何数据了。使用find指令可以找到所有属于某个帐号的数据:find / -userusername

Useradd/usermod/userdel都是系统管理员使用的指令,一般用户无法使用

一般用户可以使用的有关帐号和密码操作的指令:

1.finger

列出的都是shadow当中的参数信息

找出目前在系统上面登入的用户和登入时间 finger

2.chfn changerfinger的缩写

改变finger的信息

3.chsh changeshell的缩写

-l 列出目前系统上面可用的shell,其实也就是/etc/shell的内容

-s 设定修改自己的shell

不论是chfn还是chsh,都是能够让一般用户修改/etc/passwd这个系统文件的,所以这连个档案的权限一定是SUID。

新增和移除群组:

群组的增删和修改都是/etc/group,/etc/gshadow的新增,修改和删除。

Groupadd:新增群组

Groupmod:与usermod类似,这个指令仅仅是进行group相关参数的修改

Groupdel:删除群组。当某个用户的初试群组设置为该群组时,无法删除该群租

Gpasswd:群组管理员功能

主机的系部权限规则:ACL的使用

ACL的主要目的是在提供传统的owner,group,others的read,write,execute权限之外的细部权限设定。ACL可以针对某一个单一使用者,单一档案或者目录来进行读写执行的权限规范,对于需要特殊权限的使用状况非常有帮助。

ACL主要针对下列项目:

使用者:可以针对使用者来设定权限

群组:针对群组为对象来设定权限

默认属性:还可以针对在该目录下在建立新档案/目录时,规范新数据的默认权限

由于acl是传统的unix-like操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行,目前绝大多数的文件系统都支持ACL的功能。CentOS预设使用ext3是启动ACL支持的。

/etc/fstab是文件系统配置文件,可以更改其设置,来使文件系统默认启动对ACL的支持。

ACL的设定技巧:getfacl setfacl

Getfacl:取得某个档案或者目录的ACL

Setfacl:设定某个档案或者目录的ACL

Setfacl

1.针对特定用户的方式 p505

2.针对特定群组的方式

3.针对有效权限mask的设定方式

如果一个档案设定了ACL参数后,它的权限部分就会多出一个+号,但是此时你看到的权限与实际权限会有误差,这时必须使用getfacl命令来观察它的权限设定。

Mask的意义:(有效权限)

使用者或者群组所设定的权限必须要存在与mask的设定范围内才会有效,因此称为有效的权限。我们可以使用mask来规范最大使用的权限,就能够避免不小心开放了某些权限给其他使用者或者群组了。如果想要ACL在目录底下的数据都有继承的功能,那就需要这样做。

也就是:

4.针对预设权限的设定方式

设定规范:d[ug]:使用者列表:[rwx]

单纯使用su切换成为root的身份,读取的变量设定方式为non-login-shell的方式,这种方式原本的变量不会被改变,由于没有改变属于root的环境,因此很多root惯用的指令就只能使用绝对路径来执行,其他的还有mail这个变量,当使用mail指令时,收到的邮件还是其他用户的,而不是root本身的邮件。

Sudo    p511

相对于su需要了解新切换的用户密码(常常是root的密码),sudo的执行则仅仅需要自己的密码即可。甚至可以设定不需要密码就可以执行sudo。由于sudo可以让你以其他用户的身份执行指令(通常是使用root的身份来执行指令),因此并非所有人都能执行sudo,而是仅有规范到/etc/sudoers内的用户才能够执行sudo这个指令。

Sudo -b 将后续的指令放到背景中让系统自行执行,而不与目前的shell产生影响

Sudo -u 后面可以接欲切换的使用者,若是无此项目则代表切换身份是root

Shell -c “一连串指令” ---使用该方法来执行一连串的指令

我们无法使用su -sshd去切换系统账号(因为系统帐号的shell是sbin/nologin),这个时候sudo真是很好用。Sudo是以某个新用户的权限执行某个动作,但并不是要有新的bash环境

Sudo的执行流程

1.当用户执行sudo时,系统于/etc/sudoers档案中搜寻该使用者是否有执行sudo的权限

2.若是使用者可执行sudo的权限后,可以让使用者输入用户自己的密码进行确认

3.若是密码输入成功,便开始进行sudo后续接的指令(但是root执行sudo时,不需要输入密码)

4.若欲切换的身份和执行者的身份相同,那么也不需要输入密码

能否使用sudo要看/etc/sudoers的设定值,而可使用sudo者是透过输入用户自己的密码来执行后续的指令。不过该档案的内容是有一定的规范的,因此直接使用vi去编辑是不好的,可以使用visudo去修改这个档案。

无法登录:nologin

无法登录指的是这个使用者无法使用bash或其他shell来登入系统,并不是说这个帐号无法使用其他的系统资源。举例来说,打印作业由lp这个帐号在管理,www服务由apache这个帐号在管理,他们都能进行系统程序的工作,但是就是无法登录主机而已。

PAM模块设定语法

PAM借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求,我们以passwd这个指令的呼叫PAM来说明,当你执行passwd后,这支程序呼叫PAM的流程是:

1.用户开始执行/usr/bin/passwd这个程序,并输入密码;

2.Passwd呼叫PAM模块进行验证

3.PAM模块回到/etc/pam.d/passwd寻找与passwd同名的配置文件

4.依据/etc/pam.d/passwd内的设定,引用相关的PAM模块逐步进行验证分析

5.将验证结果回传给passwd这个程序

6.Passwd程序会根据PAM回传的结果来决定下一个动作(重新输入新密码或者通过验证)

(1)我们总是得先验证身份(auth)后 (2)系统才能够借由用户的身份给予适当的授权和权限设定,而且登录和注销的环境才需要设定,也才需要记录登入和注销的信息(session)。如果在运行期间需要密码修订时,才给与password的类别。

/etc/security会影响到root可登入的安全终端机,/etc/nologin会影响到一般使用者能否登入的功能之外,PAM相关的配置文件在/etc/pam.d,说明文件在/usr/share/doc/pam-版本,实际模块在/lib/security/。相关的PAM主要在/etc/security这个目录内

/etc/security/limits.conf

使用ulimits指令限制用户的操作将在这个文件内记录,这个档案的设定完成就生效了,你不用重新启动服务的。但是PAM有个特殊的地方,由于他是在程序呼叫时才予以设定的,因此你修改完成的数据,对于已经登入系统中的用户是没有效果的,要等他再次登录时才能生效。

查询使用者:w,who,last,lastlog

如果想要知道目前已登录到系统上面的用户使用w或者who来查询

如果想要知道帐号的最近登入时间,可以使用lastlog这个指令。Lastlog会去读取/var/log/lastlog档案,并将结果输出

使用者对谈:write,mesg,wall

Write是写给某个用户的,wall是写给所有在线的用户的

使用者邮件信箱:mail

使用wall,write指令要等到使用者在线才能够进行,但是在linux主机上面的用户都会具有一个mailbox,一般来说,mailbox都会放在/var/spool/mail里面,一个帐号一个mailbox。可以直接使用mail指令向该mailbox中投递信件。

例如:mail vbird1-s "nice to meet you" >filename ,可以将filename中的数据重导向到nice to meet信件中。/home/vbird/mbox为收件夹的意思,var/spool/mail/vbird为新件夹。

密码转换:pwconv  pwuconv

Pwck这个指令在检查/etc/passwd这个帐号配置文件内的信息,与实际的家目录是否存在等信息,还可以比对/etc/passwd /etc/shadow的信息是否一致,另外,如果/etc/passwd内的数据字段错误时,会提示使用者修订。

Pwconv:这个指令的主要目的是在将/etc/passwd内的帐号和密码,移动到/etc/shadow当中。

Pwunconv:将/etc/shadow内的密码栏数据写回/etc/passwd当中,并且删除/etc/shadow档案。

Chpasswd:它可以读入未加密前的密码,并且经过加密后,将加密后的密码写入到/etc/shadow当中。它可以由标准输入读入数据。

VFAT文件系统不支持Linux Quota功能

Mount 可以用来查询文件系统的类型

手动开启文件系统quota功能

Mount -o remount,usrquota,grpquota /home

当你重新挂载时,系统会同步更新/etc/mtab这个档案,所以你必须要确定/etc/mtab已经加入usrquota,grpquota的支持到你所要想设定的文件系统中。不过手动挂载的数据在下次重新挂载的时候就会消失,因此最好写入配置文件中。可以修改/etc/fstab文件系统配置文件。

其实quota是透过分析整个文件系统中,每个使用者(群组)拥有的档案总数和总容量,再将这些数据记录在这个文件系统的最顶层目录,然后在该目录文件中再使用每个帐号(或群组)的限制值去规范磁盘的使用量的。所以,这个quota记录文件就非常重要

扫描文件系统并建立quota的记录文件:quotacheck指令

Quota启动,关闭与限制值设定

Quotaon 启动

系统的初始化脚本:/etc/rc.d/rc.sysinit

关闭quota的服务:quotaoff

Edquota:编辑帐号/群组的限值和宽限时间

Quota限制值的报表

针对文件系统的限额做报表:repquota

直接到/etc/mtab中搜寻具有quota标志的文件系统,并报告quota的结果。

Warnquota:对超过限额者发出警告信

/etc/warnquota.conf

Setquota:直接在指令中设定quota限额

不像edquota是呼叫vi来进行设定,setquota直接由指令输入所必需的各项设定值

Linux工作排程的种类:at,cron

两种工作排程的方式:

一种是例行性的,就是每隔一定的周期要办的事项

一种是突发性的,就是每次做完之后就没有的那一种

在linux下使用at和crontab这两个东西

At是个可以处理仅仅执行一次就结束排程的指令,不过要执行at时,必须要atd这个服务的支持,但是在某些distribution中,atd可能预设是没有启动的,centos预设是启动atd服务的

Crontab这个指令所设定的工作将循环的一直执行下去。Crontab除了可以使用指令执行外,还可以编辑/etc/crontab来支持。让crontab可以生效的服务则是crond这个服务。

Linux上的常见例行性工作

1.进行登录档的轮替(log rotate)

2.登录文件分析logwatch的任务

如果发生软件问题,硬件问题,资安问题等,绝大部分的错误信息都会被记录到登录文件中,因此系统管理员最重要的任务之一就是分析登录档。Centos 提供了一个程序logwatch来主动分析登录记录

3.建立locate的数据库 系统会主动的进行updatedb操作

4.Whatis数据库的建立 whatis是与man page有关的一个查询指令,但是要使用whatis指令时,必须先建立whatis数据库

5.RPM软件登录文件的建立 RPM是一种软件管理的机制。由于系统可能会常常变更软件,包括软件的新安装,非经常性更新,都会造成软件文件名的差异。为了方便未来追踪,系统也帮我们将文件名做个排序的记录。有时候系统也会透过排序过程来帮忙RPM数据库的重新建置。

6.移除暂存档系统通过tmpwatch指令来删除暂存档

7.与网络服务有关的分析行为

单一排程的运作:atd

Atd的启动和at运作的方式:/etc/init.d/atdrestart

Checkconfig atd on

At的运作方式:当我们使用at这个指令来产生所需要运作的工作,并将这个工作以文本的形式写入到/var/spoll/at/目录中,该目录便能等待atd这个服务的取用和执行了。

我们可以利用/etc/at.allow与/etc/at.deny这两个档案来进行at的使用限制

1.现寻找/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者不能使用at(即使没有写在at.deny当中)

2.如果/etc/at.allow档案不存在,就寻找/etc/at.deny这个档案,若是写在这个at.deny的使用者则不能使用at,而没有在这个档案中的使用者可以使用at

3.如果两个档案都不存在,那么只有root可以使用at这个指令了

实际运作单一工作排程:P588

At -mldv TIME 执行at指令会进入at shell,让你下达多重指令进行等待动作,使用at下达指令时,最好使用绝对路径来下达相关的指令,比较不会出问题

At的执行和终端环境有关,而所有的standard output/standard input/standard error output都会传递到执行者的mailbox中去,所以在终端机中看不到任何信息。可以通过终端机的装置来处理。假如你是用tty1登录,则可以使用echo"hello">/dev/tty1来取代

系统会将at工作独立出你得bash环境,直接交给系统的atd程序来接管,所以当你下达了at的工作之后就立刻脱机了,剩下的工作就完全交给linux管理即可。所以,如果有长时间的网络工作时,使用at可以让你免除网络断线的困扰。

At错误指令的移除:atq(查询) atrm(移除)

Batch:系统有空时才进行背景任务

其实batch是利用at来进行指令的下达,只是加入一些控制参数而已,batch会在CPU工作负荷小于0.8的时候,才进行你所下达的任务。CPU的工作负荷表示CPU在单一时间点所负责的工作数量,也就是执行的线程或进程的数量。CPU的工作负载大,代表CPU必须在不同的工作之间进行频繁的工作切换。

Batch的指令下达和at完全相同,只是若那个时间点系统忙,则batch下达的指令不会被执行。

循环执行的例行性工作安排

相对于at仅执行一次的工作,循环执行的例行性工作排程则是由cron这个系统服务来控制的。Linux系统上面原本有很多例行性的工作,因此这个系统是默认启动的

使用者的设定 P591

/etc/cron.allow /etc/cron.deny两个文件来管理允许和拒绝的使用者。以优先级来说,/etc/cron.allow比/etc/cron.deny要优先,这两个档案只能选择一个来限制而已,因此只要保留一个。

当使用crontab这个指令来建立工作排程之后,该项工作会被记录到/var/spoll/cron/里面去,例如dmtsai使用crontab后,他的工作会被记录到/var/spool/cron/dmtsai里头去。Cron执行的每一项工作都会被记录到/var/log/cron这个登录档案中。

Crontab编辑各自段的含义 p591

系统的配置文件:/etc/crontab

这个crontab -e是针对使用者的cron来设计的,如果是系统的例行性任务,只要编辑/etc/crontab这个档案就可以了。有一点需要特别注意,那就是crontab -e这个crontab其实是/usr/bin/crontab这个执行档,但是/etc/crontab可是一个纯文本挡,可以使用root的身份编辑一下这个档案。

Cron这个服务的最低侦测限制是分钟,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容,因此只要编辑完成/etc/crontab这个档案后,并且将他储存之后,那么cron的设定会自动的被用来执行了。

Anacron

Anacron并不是取代crontab,它的存在的目的就是在于处理非24小时一直启动的linux系统的crontab的执行。所以anacron并不是指定何时执行某项任务,而是以天为单位或者在开机后立刻执行

Anacron是一个程序而并不是一项服务,在crontab中会调用这个程序,是系统的例行性行为。

系统默认的例行性命令都放置在/etc/cron.*里面,所以可以查看/etc/cron.daily/,/etc/cron.weel/,/etc/cron.monthly/这三个目录中记载。

程序:

程序被执行后,执行者的权限和属性,程序的程序代码和所需要的数据都会被加载到内存,操作系统会给予这个内存内的单元一个标识符(PID),所以,进程就是在运行中的程序。

父程序和子程序:

当我们登入系统后,会取得一个bash的shell,然后,我们利用这个bash提供的接口再去只想能够另一个指令,例如/usr/bin/passwd或者是touch等等,那些另外执行的指令也会被触发成为PID。那个后来执行指令才产生的PID就是子程序了,而我们原来的bash环境,就称为是父程序了。连续执行两个bash后,第二个bash的父程序就是前一个bash,因为每个程序都有一个Parent PID(PPID)。

使用ps -l来查看系统中正在执行的程序

Fork and exec:过程调用的流程

1.系统先以fork的方式复制一个与父程序完全相同的暂存程序,这个程序和父程序唯一的差别就是PID不同,但是这个暂存程序会有一个PPID的参数,PPID如前所述,就是父程序的程序标识符

2.暂存程序开始以exec的方式加载实际要执行的程序,新的程序名称改变。

常驻在内存的程序通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻内存的程序就被我们称为是服务。系统服务非常多,但是大致上可以分为系统本身所需要的服务:crond,atd,还有syslog等等,还有一些负责网络联机的服务,例如apache,named,postfix,vsftpd等等。这些程序被执行后,他会启动一个可以负责忘了监听的端口号,以提供外部客户端的联机要求。Linux不会出现当机的时候,因为可以在任何时候,将某个被困住的程序杀掉,然后再重新执行该程序而不用重新启动。

Ps -aux,然后kill

Bash环境下的工作管理(job control)

当我们登入bash之后,就是取得一个名为bash的PID了,而在这个环境底下所执行的指令,就几乎都是所谓的子程序了。在这个单一的bash接口下,我是否可以进行多个工作,意思就是不产生新的bash,而是让程序交给系统,到后台去执行

/etc/security/limits.conf里面设定了使用者可以同时登入的联机数,某些使用者可能仅能以一个联机来工作。

放入背景的工作想要正常运转,他必须不和使用者进行互动,而且不能使用ctrl +c来进行终止。

进行bash的job control必须要注意的限制:

1.这些工作所触发的程序必须来自于你shell的子程序(管理自己的bash)

2.前景:你可以控制与下达指令的这个环境称为前景的工作

3.背景:可以自行运作的工作,你无法使用ctrl+c来终止,可以使用bg/dg呼叫该工作

4.背景中执行的程序不能等待terminal/shell的输入

如前所述,当我们想要在只有一个bash'的环境下进行多项工作,那么可以将某些工作直接丢到背景环境中去执行,也就是使用&

在背景中执行的指令,如果有stdout或者stderr时,他的数据依旧还是会输入到屏幕当中,我们会无法看到提示字符,也无法完全的掌握前景工作,最佳的情况就是利用数据流重导向,将要输出的数据传送到某个档案中。

将目前的工作丢到背景中去执行暂停:ctrl+z

观察目前的背景工作状态:jobs-lrs

+号代表预设的取用工作,也代表最近被放到背景的工作号码,-代表最后第二个被放到背景中的工作号码,如果仅输入fg时,那么+号任务将会被放到前景来处理。

将背景工作拿到前景来处理:fg

将工作在背景下的工作状态变成运作中:bg

Kill -signal %jobnumber signal是告诉程序该怎么做

要注意的是,我们在工作管理中提到的背景指的hi终端机模式下可以避免ctrl+c中断的一个环境,并不是放到系统的背景下去,所以,工作管理的背景依旧和终端机有关,在这种情况下,如果是以远程联机的方式连接到你的linux主机,并且将工作以&的方式放到背景中去,在工作尚未结束的情况下,万一脱机,该工作是不会继续的,而是被中断掉。在这种情况下,可以考虑at来处理。因为at是将工作放到系统背景,而与终端机无关。另外,如果不想使用at的话,可以尝试使用nohup这个指令来处理。这个nohup可以让你在脱机或者注销后,还可以继续进行。但是nohup并不支持bash内建的指令,因此你的指令必须要是外部指令才行。  P609

程序的观察

利用静态的ps或者是动态的top,还能以pstree来查阅程序树之间的关系。一个可以查询自己bash程序的ps -l,一个则是可以查询所有系统运作的程序ps -aux。使用ps -l仅列出与你的操作环境bash相关策程序而已,亦即最上层的父程序只会是你得bash而没有延伸到init这只程序去

程序的状态:

R:该程序正在运作中

S(SLEEP):该程序正在睡眠状态,但可以被唤醒(signal)

D:不可被唤醒的睡眠状态,通常这支程序可能在等待I/O的情况(例如正在打印)

T:停止状态(stop),可能是工作控制(背景暂停)或出错状态

Z(Zombie):僵尸状态,程序已经终止但是却无法从内存中移除。

TTY:登入者的终端机的位置,若为远程登录则使用动态终端接口(pts/n)

观察系统所有程序的状态:ps-aux

僵尸程序的成因是该程序已经执行完毕或者因故应该要终止了,但是该程序的父程序却无法将该程序结束掉,而造成那个程序一直存在在内存当中。

事实上,僵尸程序已经无法管控,而直接是交给init这支程序来负责的,但是init程序使系统的第一支执行的程序,他是所有程序的父程序,我们无法杀掉init程序,所以很多时候我们只能使用reboot的方式来将僵尸程序抹去。

Ps是截取一个时间点的程序状态,但是使用top指令可以动态的观察程序的状态

Kill -signal PID

如果要确认有没有重新启动过syslog,可以参考登录档的内容,使用下面指令查看就行

Tail - n /var/log/message 里面放了程序的状态

Killall -signal 指令名称

可以将系统中该指令名称启动的程序全部删除

优先级:pri  nice值的和才是程序的优先级

Nice值可调整的范围是-20-19

Root可随意调整自己或他人程序的nice值,且范围是-20-19

一般用户只能调整自己程序的nice值,且范围是0-19(避免一般用户抢占系统资源)

一般使用者仅能调高nice值

使用nice指令 调整程序的优先级

例如将备份程序的优先级调低,只有当系统比较空的时候,才执行不太重要的备份指令

如果要调整的是已经存在的某个程序的话,那就只能使用renice指令来调整程序的优先级

指令:renice -nPID

Nice值是可以在父程序,子程序之间传递的,父程序的nice值如果被修改了,那么子程序的nice值也自动会改变

系统资源的观察

内存的使用情况和swap的使用情况:free

查看系统和核心相关信息:uname

Uptime:观察系统的启动时间和工作负载

Netstat:追踪网络或者插槽文件

除了网络上的联机之外,其实linux系统上面的程序是可以接收不同程序所发送来的信息,这就是linux上面的插槽档(socket file)。Socket file可以沟通两个程序之间的信息,因此程序可以取得对方传送过来的资料。由于有socketfile,因此类似X Windows这种需要网络连接的软件,目前的新版distribution就以socket来进行窗口接口的联机机制了。

分析核心产生的信息:dmesg

系统在开机的时候,核心会去侦测系统的硬件,你的硬件有没有被捉到,那就与那个时候的侦测有关。但是这些侦测的过程要不是没有显示在屏幕上,就是飞快的在屏幕上一闪而逝。可以将核心的侦测的讯息捉出来,就是使用dmesg指令。所有核心侦测的讯息,不管是开机还是系统运作的过程中,反正只要是核心产生的讯息,都会被记录到内存的某个保护区段。Dmesg指令能够将该区段的讯息读出来,因为讯息实在是太多了,可以使用管线命令|more来暂停画面

Vmstat:侦测系统资源的 动态变化

程序都是在内存当中的,而内存中的数据都是写入到/prco/*这个目录中的,所以可以直接观察/proc目录下的数据来观察内存中的数据

针对整个linux系统相关的参数,那就是在/proc目录底下的档案,相关的档案和相关的内容是这样的: p628

Fusr:借由档案或者文件系统找出正在使用该档案的程序

有的时候想要知道我的程序到底启动过程中开启了多少档案,可以使用fusr来观察,举例来说,当你卸载时发现系统通知,device is busy,那表示这个文件系统正在忙碌中,表示某只程序正在利用该文件系统

Lsof:列出被程序所开启的档案文件名

Pidof:找出某只正在执行的程序的PID

SELinux:整合到核心的一个模块

系统资源都是通过程序来存取的,如果/var/www/html如果设定为777,那么代表所有程序都可以对该目录存取,万一你真的启动了www服务器软件时,那么该软件所触发的程序将可以写入该目录,而该程序却是对整个Internet提供服务的,那么外部的人就可以对你的系统写入些莫名其妙的东西。

自主式访问控制:DAC

基本上,就是依据程序的拥有者和档案资源的rwx权限来决定有无存取的能力。DAC的困扰就是当用户取得程序时,例如一般用户取得属于root的程序,那么他可以借由这只程序与自己默认的权限来处理自己的档案资源。

以政策规则制定特定程序读取特定档案:委任式访问控制,MAC

可以针对特定的程序和特定的档案来进行权限的管控,也就是说即使你是root,那么在使用不同的程序时,你所能取得的权限不一定是root,而要看当时这个程序的设定而决定。如此一来,我们针对控制的主体变成了程序而不是用户。此外,这个主体程序也不能任意使用系统档案资源,因为每个档案资源也有针对该主体程序可取用的权限。

SELinux是通过MAC的方式来管控程序,他控制的主体是程序,而目标则是该程序能否读取的档案资源

政策:

由于程序和档案数量庞大,因此SELinux会依据某些服务来制定基本的存取安全性政策,这些政策还会有详细的规则来指定开放某些资源的存取与否。

主体(程序)如何取得文件系统的访问权限

 

安全性本文存在与主体程序中和目标档案资源中,程序在内存中,所以安全性本文可以存入是没问题的,那档案的安全性本文是记录在哪里?事实上,安全性本文是记录在档案的inode中的饿,因此主体程序想要读取目标档案资源时,同样需要读取inode,这inode内就可以比对安全性本文以及rwx等权限是否正确,而给予适当的读取权限依据。

Ls -Z读取档案的安全性本文

Getenforce 了解目前SELinux的模式

了解SELinux的政策(policy):setstatus

查看核心有没有关闭SELinux,可以到/boot/grub/menu.lst这个档案中去查看

SELinux是核心的一部分,当SELinux改变状态时,需要重新编译核心,因此需要重新启动才能改变SELinux的状态。

Linux的启动过程:

init进程是系统所有进程的七点,内核在完成核内引导以后,即在本进程空间内加载init程序,它的进程号码是1。Init进程是所有进程的发起者和控制者。因为在任何基于linux的系统中,他都是第一个运行的进程,所以init进程的编号(PID)永远是1。

Init进程主要有两个作用,第一个作用是扮演终结父进程的角色,因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以他为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现以init为参照的情况,所有那些失去父进程的子进程都会以init作为他们的父进程。

Init的第二个作用就是在进入某个特定的运行级别时运行相应的程序,依此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。

通过/etc/inittab文件进行初始化

Init的工作是根据/etc/inittab来执行相应的脚本,进行系统的初始化,如设置键盘、字体、装载模块,设置网络等。

1./etc/rc.d/rc.sysinit

rc.sysinit是init执行的第一个脚本,它主要是完成一些系统的初始化的工作

2./etc/rc.d/rcX.d/KS

3./etc/ec.d/rc.loacl

4.执行/bin/login程序

具体看Linux的启动一书

由于在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这种进程的控制终端,当控制终端关闭时,相应的进程就会自动关闭,但是守护进程却能够突破这种限制,他从被执行开始运转,直到整个系统关闭才会被关闭,如果想让某个进程不因为用户或者终端或其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。

由于CentOS预设使用targeted这个政策,而这个政策主要是管理网络服务,本机端的程序则不受SELinux的管制。

重设SELinux安全性本文:chcon(设置) restorecon(恢复默认)

Setroubleshoot  将错误讯息写入到/var/log/message

Auditd 详细资料写入/var/log/audit/audit.log

政策查询:seinfo

/etc/init.d/*:启动脚本放置处,系统几乎所有的服务启动脚本都是放在这里。事实上这是公认的目录,其实是一个link,实际上是放在/etc/rc.d/init.d/。这里面的脚本会去侦测环境,搜素配置文件,加载distribution提供的函数功能,判断环境是否可以运作此daemon,等到一切都侦测完毕而且确定可以运作之后,再以shell script的case esac语法来启动,关闭,观察此daemon

/etc/sysconfig:个服务的初始化环境配置文件,几乎所有的服务都会将初始化的一些选项设定写入到这个目录下。举例来说,登录档的syslog这支daemon的初始化设定就写在/etc/sysconfig/syslog这里,而网络的设定则是写在/etc/sysconfig/network这个档案中

/etc/xinetd.conf,/etc/xinetd.d/*:super daemon配置文件 super daemon只是一个统一的管理的机制,他所管理的其他daemon的设定则是写在/etc/xinetd.d/*里头。

/etc/*个服务各自的配置文件

/var/lib/*:个服务产生的数据库

/var/run/*:个服务的程序之PID记录处

Rsync:可以让两个主机上面的目录一模一样,在远程异地备援系统上面是一个很好的机制。

服务的防火墙管理:xinetd,tcp Wrappers

一般来说,系统的防火墙主要可以透过封包过滤或者是透过软件分析,我们的linux默认有提供一个软件分析的工具,那就是/etc/hosts.deny,/etc/hosts.allow这两个配置文件。

任何以xinetd管理的服务,都可以透过/etc/hosts.allow,/etc/hosrs.deny来设定防火墙。其实这两个配置文件都是/usr/sbin/tcpd的配置文件,而这个/usr/sbin/tcpd则是用来分析进入系统的TCP网络封包的一个软件,这个套件的功能就是分析TCP忘了数据封包。所以,我们使用TCP Wrappers来管控的就是:

1.来源IP或整个网段的IP

2.Port(就是服务)

Ldd指令(library dependency discovery)这个指令可以查询某个程序的动态函数库的支持状态

/etc/xinetd.conf称为默认值的配置文件。因为如果你有启动某个super daemon管理的服务,但是该服务的设定值并没有在指定的上述的那些项目,那么该服务的设定值就以上述的默认值为主。至于更多的设定值,在/etc/xinetd.d里面。

基本上只要一个服务受到xinetd管理,或者是该服务的程序支持TCP Wrappers函式的功能时,那么该服务的防火墙方面的设定就能够以/etc/hosts.{allow,deny}来处理。换个方式来说,只要不支持TCP Wrappers函式功能的软件程序就无法使用/etc/hosts.{allow,deny}的设定值了。查看一个程序是不是支持TCP Wrappers,可以使用ldd $(which sshd httpd),重点就是看这个软件是否支持libpam.so.0这个函式库。

要确定有没有安装某款软件,可以使用rpm-q,例如查看是否安装了tcp_wrappers这款软件,可以使用rpm -q tcp_wrappers来查询

TCP Wrappers的特殊功能:

例如,当有人扫描我的rsyncport时,我就将他的IP记住,以作为未来的查询之用,要达成这样的功能,需要有额外的动作参数加在第三栏了,而且必须安装了TCP Wrappers软件才行。

Spawn(action)

可以利用后面的shell来进行额外的工作,且具有变量的功能,主要的变量内容是:%h(hostname),%a(address),%d(daemon)等等。

Twist(action)

立刻以后续的指令进行,且执行完后终止该次联机的需求(deny)

为了达成追踪来源目标的相关信息的目的,此时我们需要safe_finger这个指令的辅助才行,而且我们还希望客户端的恶意程序被警告,这个流程可以是这样的:

1.利用safe_finger去追踪出对方的信息(包括主机名,用户相关信息等)

2.利用追踪到的信息以email的方式寄给主机的root

3.在对方的屏幕上面显示不可登录的信息并警告他已经被记录

观察系统启动的网络服务

Netstat  -tulp

使用netstat仅能观察到目前已经启动的daemon,使用service这个指令或者是/etc/init.d/* start的方法仅能在目前的环境下立即启动某个服务。Linux主机的开机顺序:

1.打开计算机电源,开始读取BIOS并进行主机的自我评测

2.透过BIOS取得第一个可开机的装置,读取主要开机区(MBR)取得开机管理程序

3.透过开机管理程序的设定,取得kernel并加载内存且侦测系统硬件

4.核心主动呼叫init程序

5.Init程序开始执行系统的初始化(/etc/rc.d/rc.sysinit)

6.依据init的设定进行daemonstart(/etc/rc.d/rc[0-6]d/*)

7.加载本机设定(/etc/rc.d/rc.local)

8.我们在启动linux系统时,可以进入不同的模式,这模式我们称为执行等级,不同的执行等级有不同的功能,例如X窗口接口的执行等级为5,另一个则是纯文本界面的执行等级是

3

Chkconfig:管理系统服务默认开机启动与否

Checonfig仅是设定开机时预设会启动的服务而已,所以该服务目前的状态时不知道的。

Ntsysv:类图形接口管理模式

Ntsysv是red hat系统特有的

如果自己写了一个程序并且想要将该程序成为系统服务好让chkconfig来管理,主要让该服务加入init可以管理的script当中,也就是/etc/init.d/当中即可

Centos预设启动的服务简易说明 p672

Syslog服务:这个服务可以记录系统所产生的各项讯息,包括/var/log/message内的几个重要的登录档案

Xfs:这个是X Font Server。主要提供图形接口的字形的一个服务,如果你不启动X窗口的话,那么这个服务可以不启动,如果你需要用到窗口时,一定要启动这个服务,否则图形接口是无法启动的

Yum—updatesd系统可以够过YUM的功能进行软件的在线升级机制,若是升级的软件释出时,就能够以邮件的形式或者syslog来通知系统来管理原来手动升级

将背景工作拿到前台来处理:fg%jobnumber

让工作在背景中继续运行:bg%jobnumber

管理背景中的工作:kill –signal%jobnumber

&指的是在终端机中的背景是不能被ctrl+c来中断的,并不是真正放到系统的背景中去,在bash退出之后,所有的工作都将被停止。At是将作业放到系统背景中去执行,而与终端机没关系。

系统程序的查询:只是查询自己的bash中运行的程序,ps –l,另外一个是查询整个系统中运行的程序ps –aux

F是程序旗标,代表该程序的权限,4代表root,1表示只进行fork而没有exec,S代表程序的状态

R (Running):该程序正在运作中

S (Sleep):开程序目前正在睡眠状忞(idle),但可以被唤醒(signal)

D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 癿情况(ex>打印)

Ps是静态攫取一个时间点的程序状态,top可以持续的监测整个系统的状态。Bash的PID可以由echo $$来取得

Pstree,free,netstat,uptime

Socket file可以沟通两个程序之间的信息,因此程序可以取得对方传过来的资料。

Dmesg:分析核心的讯息

系统在开机的时候,核心会去侦测系统的硬件,你的某些硬件有没有被捉到,那就和这个时候的侦测有关,所有核心侦测的讯息,不管是开机时候还是系统运作的过程中,反正只要是核心产生的讯息,都会被记录到内存的某个保护区段。Dmesg这个指令就能够将该区段的讯息读出来。

Vmstat:侦测系统资源的变化

内存中的数据都是写入到/proc/*文件夹中,可以直接观察/proc/中的内容来看内存中的内容。基本上,目前主机上面的各个程序的PID都是以目录的形式存在于/proc当中。举例来说,我们开机所执行的第一个程序init的PID是1,那么这个PID的所有相关信息都是写入到/proc/1/*当中。

Fuser:借由档案(或文件系统)找出正在使用该档案的程序。有的时候我想要知道我的程序在这次启动过程中到底开启了多少档案,那么我可以使用lsof来观察,losf列出了被程序所开启的档案文件名

找出某支正在执行的程序的PID:pidof  program_name

MAC(委托式访问控制):它可以针对特定的程序与特定的档案资源来进行权限的控管,也就是说,即使你是root,那么在不同的程序时,你所能取得的权限不一定是root,而是要看当时该程序的设定,如此一来,我们针对控制的主体变成了程序而不是用户了。此外,这个主体程序也不能随便的使用系统资源,因为每个档案资源也有针对该主体程序设定的可取用的权限。SELinux提供了一些预设的政策,并且在该政策内提供了多个规则,可以让你选择是否启用该控制规则。在委托式访问控制的设定下,我们的程序能够活动的空间就变小了,举例来说,www服务器软件的达成程序为httpd这支程序,而默认的情况下,httpd仅能在/var/www/这个目录下存取档案,如果httpd这个程序想要到其他的目录下存取档案,除了规则设定要开放外,目标目录也要设定成httpd可读取的模式才行。

由于程序和档案的数量庞大,因此SELinux会依据某些服务来制定基本的存取安全性政策,这些政策还会有详细的规则来指定不同的服务开放某些资源的存取与否。

在目前的SELinux里面提供两种主要的政策,分别是:

Targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策。建议使用预设的政策最好。

Strict:完整的SELinux限制,限制方面较为严格

主体程序必须经过SELinux政策内的规则放行后,就可以和目标资源的安全性文本进行比对,若是比对失败则无法存取目标资源。安全性文本存在于主体程序中和目标资源档案中,程序在内存中,所以安全性本文可以存入是没有问题的。档案的安全性本文是放置在档案的Inode内的,因此主体程序想要读取目标资源时,同样需要读取inode,这inode内就可以比对安全性本文以及rwx等权限值是否正确,而给予适当的读取权限依据。观察安全性本文可以使用ls –Z指令。

Getenforce查看SELinux的运作模式,setenforce设置SELinux的运作模式,sestatus查看SELinux的政策,安全性本文内容位于/etc/sestatus.conf中

SELinux的启动和关闭:

SELinux的模式的改变或者是政策的改变需要重新启动计算机,这是因为SELinux是整合到核心里面去的,你只能在SELinux运作中切换为强制的或者是宽容的,不能够直接关闭SELinux。因为是核心的一部分,需要在核心重新加载的时候才能启用新配置的内容。

/boot/grub/menu.lst中存放的是系统加载的核心档案部分。

直接修改安全性本文:chcon

回复系统预设的安全性本文:restorecon

Setrobuleshoot服务:将错误讯息和客服方法写入/var/log/messages中。在系统启动时开启某个服务;chkconfig指令

Auditd:详细资料写入/var/log/audit/audit.log中

SELinux的政策查询:

Seinfo 列出SELinux的状态,规则布尔值,身份识别,角色,类别等信息

Sesearch

Restorecon每个目录或者档案都会有默认的安全性本文,会制定目录的安全性本文,是因为系统的一些服务所放置档案的目录是已经确定的。

查询目录的默认的安全性本文:semanage

Stand_alone:此daemon可以自行单独启动服务,可以自行启动而不必透过其他机制的管理。Daemon启动并加载到内存中之后就一直占用内存和系统资源,最大的优点就是:因为是一直存在内存内持续的提供服务,因此对于客户端的要求,stand alone的daemon响应速度较快,常见的stand alone daemon有www的daemon(httpd),ftp的daemon(vsftpd)等等

Superdaemon :一只特殊的daemon来统一管理

这一种服务的启动方式是借由一个统一的daemon来负责唤起服务,这个特殊的daemon就称为superdaemon。早期的super daemon是inetd这个,后来被xinetd取代,当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时,super daemon才唤醒相应的服务,当客户端的要求结束后,被唤醒的这个服务也会关闭并释放系统的资源。Super daemon是常驻在内存中的。

系统中让服务和端口号对应在一起的设定:/etc/services

特别需要注意,虽然有的时候可以借由/etc/services来更改一个服务的端口号,不过并不建议如此做,因为很有可能会造成一些协议的错误情况(除非想要架设地下网站)

Daemon的启动脚本和启动方式:

为了管理上面的方便,所以通常distribution都会记录每一只daemon启动后所取得程序的PID在var/run/这个目录底下。在启动这些daemon之前,你也要自行处理一下daemon能够顺利执行的环境是否正确。为了解决上面提到的问题,通常distribution会给我们一支简单的shell script来进行启动的功能,该script可以进行环境的侦测,配置文件的分析,PID档案的放置,以及相关重要文件档案的锁住动作,你只要执行该script,上述的动作就能一口气的完成,最终能够顺利且简单的启动这个daemon

/etc/init.d/* :启动脚本放置处

系统上几乎所有的服务启动脚本都放置在这里!事实上这是公认的目录,我们的 CentOS 实际上放置在 /etc/rc.d/init.d/ 啦! 不过还是有讴定连结档到 /etc/init.d/ 的!既然这是公讣的目录,因此建议您记忆这个目录即可

/etc/sysconfig/* :各服务的初始化环境配置文件

几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,登录档的 syslog 这支 daemon 的初始化设定就写入在 /etc/sysconfig/syslog 这里呢!而网络的设定则写在 /etc/sysconfig/network 这个档案中。所以,这个目录内的档案也是挺重要的;

/etc/xinetd.conf, /etc/xinetd.d/* :superdaemon 配置文件

super daemon 的主要配置文件 (其实是默认值) 为 /etc/xinetd.conf ,不过我们上面就谈到了, super daemon 只是一个统一管理的机制,他所管理的其他 daemon 的设定则写在 /etc/xinetd.d/* 里头

/etc/* :各服务各自的配置文件

/var/lib/* :各服务产生的数据库

/var/run/* :各服务的程序之PID 记录处

Service仅是一支script,它可以分析你下达的service后面的参数,然后根据你的参数再到/etc/init.d/去取得正确的程序。

Super daemon自己启动的方式和stand alone是相同的,但是他所管理的其他daemon就不是这样做的,必须在设定文件中设定启动该daemon才行,配置文件就是/etc/xinetd.d/*的所有档案。

Xinted能够控制联机的行为,这些控制的手段可以让我们的某些服务更加安全,资源管理更加合理,而由于super daemon可以做这些管理,因此一些对客户端开放较多权限的服务(例如telnet),或者本身不具有管理机制或者防火墙的服务,就可以透过xinted来管理。

Xinted的默认配置文件:/etc/xinted.conf。

为什么/etc/xinetd.conf可以称为默认值的配置文件呢?因为如果你有启动某个 super daemon 管理的服务, 但是该服务的设定值并没有指定上述的那些项目,那举该服务的讴定值就以上述的默认值为主

服务的防火墙管理xinted,TCPWrappers

/etc/hosts.allow, /etc/hosts.deny管理某些程序是否能够接受或者拒绝来自因特网的联机的。任何以xinted管理的服务,都可以透过/etc/hosts.allow,/etc/hosts.deny来设定防火墙。其实/etc/hosts.allow与/etc/hosts.deny也是/usr/sbin/tcpd的配置文件,而这个/usr/sbin/tcpd则是用来分析进入系统的TCP网络封包的一个软件,包括www,email,ftp等等都是使用TCP封包来达成联机。这个套件本身的功能就是分析TCP网络数据封包,而TCP封包的头文件主要是记录了来源和目的主机的IP和port,因此借由分析TCP封包并搭配/etc/hosts.allow(deny)的规则对比,就可以决定该联机是否能够进入我们的主机。

ldd (library dependencydiscovery) 这个指令可以查询某个程序的动态函式库支持状态

TCP Wrappers 特殊功能 P666

观察启动网络监听的服务:netstat

观察所有的服务状态:service–status-all

Chkconfig:管理系统服务默认开机启动与否

Chkconfig与ntsysv:如果我自己写了一个程序并且想让该程序成为系统服务好让chkconfig来管理,只要将该服务加入init可以管理的script当中,也就是/etc/init.d/当中

登录档

1.解决网络服务的问题

由于网络服务的各种问题通常都会被写入特别的登录档,举例来说,邮件服务器的信息都会被记录到了/var/log/maillog

3.过往事件记录薄

Centos提供syslogd这个服务来统一管理登录档案,专门记录核心信息的登录文件服务就是klogd。所以说,登录档所需要的服务就是syslogd和klogd俩个。

Logrotate:自动更新登录档

开机:

开机管理程序可以指定使用哪个核心档案来开机,并实际加载核心到内存中解压缩和执行,此时核心就能够在内存中活动,并侦测所有硬件信息与加载适当的驱动程序来使整部主机开始运作,等到核心侦测硬件与加载驱动程序之后,操作系统就开始在机器上跑了。

系统的开机过程

1.  加载bios的硬件信息并进行自我检测,并依据设定取得第一个可开机的装置

2.  读取并执行第一个可开机装置的MBR的BOOTLOADER(也就是gurb,spfdisk等程序)

3.  依据bootloader的设定加载kernel,kernel会开始侦测硬件并加载驱动程序

4.  在硬件驱动成功后,kernel会主动呼叫init程序,而init会取得run-level信息

5.  Init执行/etc/rc.d/rc.sysinit档案来准备软件执行的作业环境

6.  Init执行run-level的各个服务至启动

7.  Init执行/etc/rc.d/rc.local档案

8.  Init执行终端机仿真程序mingetty来启动login程序,最后用户登录

 加载核心侦测硬件与 initrd的功能

当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主存储器当中, 并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网络卡、声卡等等。 此时 Linux 核心会以自己的功能重新侦测一次硬件,而不一定会使用 BIOS 侦测到的硬件信息喔!也就是说,核心此时才开始接管 BIOS 后的工作了。 那么核心档案在哪里啊?一般来说,他会被放置到 /boot 里面,并且取名为 /boot/vmlinuz 才对!

第一支程序init及配置文件/etc/inittab与runlevel

在核心加载完毕,进行完硬件侦测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了,此时核心会主动去呼叫第一支程序,那就是sbin/init。/sbin/init的最主要的功能就是准备软件执行的环境,包括系统的主机名,网络设定,语系处理,文件系统格式以及其他服务的启动等,而所有的动作都会透过init的配置文件,也就是/etc/inittab来规划,而inittab内还有一个很重要的设定项目,也就是默认的runlevel。

CentOS 当中,如果我们想要加载核心模块的话,可以将整个模块写入到/etc/sysconfig/modules/*.modules当中,在该目录下,叧要记得档名最后是以 .modules结尾即可。这个过程是非必要的,因为我们目前的默认模块实在已经很够用了,除非是您的主机硬件实在太新了,非要自己加载新的模块丌可,否则,在经过/etc/rc.d/rc.sysinit的处理后,你的主机系统应该是已经跑得很顺畅了

开机过程会用到的主要配置文件

我们在 /sbin/init 的运作过程中有谈到讲多执行脚本,包括 /etc/rc.d/rc.sysinit 以及 /etc/rc.d/rc 等等, 其实这些脚本都会使用到相当多的系统配置文件,这些开机过程会用到的配置文件则大多放置在 /etc/sysconfig/ 目录下。 同时,由亍核心还是需要加载一些驱动程序 (核心模块),此时系统自定义的装置与模块对应文件 (/etc/modprobe.conf) 就显的挺重要了。

Depmod:查看核心模块相依性

加载核心模块数量的观察:lsmod。Modinfo查看某个核心模块的信息,modprobe这个指令可以加载模块,这是因为modprobe会主动的去搜寻modules.dep的内容,先克服了模块的相依性后,才决定需要加载的模块有哪些。至于insmod则完全由使用者先行加载一个完整文件名的模块,并不会主动的分析模块相依性。

移除模块 rmmod

核心模块的额外参数设定:/etc/modprobe.conf

开机管理与grub P720

重置initrd档案:mkinitrd指令

整个安装不与grubshell 的动作其实很简单, 如果您有兴趣研究的话,可以使用 info grub 去查阅。

用『 root(hdx,x) 』选择含有 grub 目录的那个 partition 代号;

用『 find/boot/grub/stage1 』看看能否找到安装信息档案;

用『 find/boot/vmlinuz 』看看能否找到 kernelfile (不一定要成功!);

用『 setup(hdx,x) 』或者『 setup(hdx) 』将 grub 安装在 boot sector 戒 MBR;

用『 quit 』来离开 grub shell

Fdisk:将分割表列出

Hdparm:可观察硬盘的信息和测试读写速度

Dmesg:观察核心运作过程中所显示的各项讯息记录

Vmstat:分析系统的状态

Lspci:列出整个pc系统的PCI接口装置

Lsusb:列出目前系统上面各个USB端口的状态,与连接的USB装置

Iostat:与vmstat类似,可实时列出整个CPU与接口设备的输入输出状态

 

Gcc和makefile

当执行make时,make会在当时的目录下搜索makefile这个文本文件,而makefile里面则是记录了原始码如何编译的详细信息,make会自动的判断原始码是否经过变动,而自动更新执行档,是软件工程相当好用的一个辅助工具。而makefile通常是软件开发商经过一直侦测程序来侦测用户的作业环境,以及该作业环境是否有软件开发商所需要的其他功能,该侦测程序侦测完毕后,会主动的建立这个makefile的规则档案,这支侦测程序的文件名是configure或者是config。

为什么要侦测作业环境?

虽然每个linux distribution都使用相同的核心,但是不同版本的核心所使用的系统呼叫可能是不同的,而且每个软件所需要的相依的函式库也是不同的,同时,软件开发商不会只是针对linux开发,而是针对整个unix-like做开发,所以他也必须侦测该操作系统平台上有没有提供合适的编译程序才行。

侦测的内容包括:

是否有合适的编译程序可以编译本软件的程序代码

是否已经存在本软件所需要的函式库,或其他需要的相依性的软件

操作系统是否适合本软件,包括linux的和新版本

Tarball档案

所谓的tarball档案,就是将软件的原始档案先以tar打包,然后再以压缩技术来压缩,通常最常用的就是gzip来压缩了,由于利用了tar和gzip,所以tarball档案一般的扩展名就是*.tar.gz或者是简写成*.tgz。所以tarball是一个软件包,将它解压缩之后,里面的档案就会有:

源代码档案

侦测程序档案

本软件的简易说明和安装说明

升级的两种方法:

1.  直接以原始码透过编译来安装和升级

2.  直接以编译好的binaryprogram来安装和升级

在预设的状态下,如果使用gcc编译原始码,如果没有加上任何的参数,则执行档的档名则会自动设定为a.out这个文件名。

编译时额外加入函式库连接的方式:

例如:gcc sin.c –lm –L/lib –L/usr/lib

-l:是加入某个函式库的意思

m则是libm.so这个函式库

-L:表示路径

Linux预设是将函式库放在/lib或者是/usr/lib当中,所以没有写路径也没有关系,但是当函式库并不是在预设的路径当中,则是必须写上路径。

Tarball软件之安装的指令下达方式:

1./configure

这个步骤就是在建立makefile这个档案,通常程序开发者会写一支script来检查你的系统,相关的软件属性等等,这个步骤相当重要,因为未来你的安装信息都是这一步骤内完成的

3.make clean

make会去读取makefile中关于clean的工作。它可以去除目标档案。因为谁也不能确定原始码里面到底有没有包含上次编译过的目标档案(*.o)存在,所以还是清除一下比较妥当

4.make

make会根据makefile当中的预设工作进行编译。编译的工作主要是进行gcc来将原始码便已成为可以被执行的object files,但是这些objectfiles通常还是需要一些函式库之类的link后,才能产生完整的执行档,使用make就是要将原是吗编译成为一个可以执行的可执行文件,而这个可执行文件放置在目前所在的目录下,尚未被安装到预定安装的目录中。

5.makeinstall

通常这就是最后的安装步骤了,make会根据makefile这个档案里面关于install的项目,将上面所编译完成的数据给他安装到预定的目录中,就完成安装了。Makeinstall主要是将编译完成的档案给他放置到文件系统中。如果安装成功,并且是安装在独立的一个目录中,例如/usr/local/packages这个目录中,那么必须手动的将这个软件的man page给它写入到/etc/man.config里面去。

Linux distribution默认的安装软件的路径,我们以apache这个软件为例:

/etc/httpd 配置文件

/usr/lib 函式库

/usr/bin 执行档

/usr/share/man 联机帮助档

用户自己安装的程序:usr/local 程序会被安装到如下几个默认的目录中

/usr/local/etc

/usr/local/bin

/usr/local/lib

/usr/local/man

如果每个软件都是选择在默认的路径下安装的话,那么所有的软件的档案都是放置到这四个目录当中。因此,如果你都安装在这个目录下的话,那么未来再想要升级或者移除的时候,就会比较难以追查档案的来源。而如果你在安装的时候选择的是单独的目录,例如我将apache安装在/usr/local/apache当中,那么你的档案会变成

/usr/local/apache/etc等文件,便于管理

Diff指令可以将两个档案之间的差异性列出来,使用patch可以更新。

函式库

在我们的linux操作系统当中,函式库是很重要的一个项目。因为很多的软件之间都会相互取用彼此提供的函式库来进行特殊功能的运作,例如很多需要验证身份的程序都习惯使用PAM这个模块提供的验证机制来实作,而很多网络联机机制则是习惯使用SSL函式库来进行联机加密的机制。不过函式库又依照是否被编译到程序内部而分为动态和静态函式库。

静态函式库:扩展名是.a,这类函式库通常扩展名为libxxx.a的类型

编译行为:静态函式库在编译的时候会直接整合到执行程序中,所以利用静态函式库编译成的程序会比较大。这类函式库最大的优点就是编译成功的可执行文件可以独立运行,而不需要向外部要求读取函式库的内容,但是升级的时候需要重新编译才能将新版的函式库整合到整个程序当中

动态函式库:扩展名.so

这类函式库通常扩展名是libxxx.so的类型

编译行为:动态函式库和静态函式库的差异很多,与静态函式库被整合到程序中不同的是,动态函式库在编译的时候,在程序中只有一个指向的位置而已。也就是说,动态函式库的内容并没有被整合到执行档中,而是当执行档要使用到函式库的机制时,程序才会去读取函式库来使用。由于执行档文件当中仅具有指向动态函式库所在的指标而已,并不包含函式库中的内容,所以他的档案会比较小。

程序的动态函式库解析:ldd

我们如何判断某个可执行的binary档案中含有什么动态函式库,可以使用ldd。

受惠于目前X86系统的支持方面,新的CPU都能够执行旧型号的CPU所支持的软件,也就是说硬件方面都是乡下兼容的,因此等级低的I386软件可以安装在所有的X86硬件平台上,不论是32位的或者还是64位的

Var/lib/rpm

若是环境检查合格了,那么RPM档案就开始安装到你的linux系统上,安装完毕后,该软件相关的信息就会被写入/var/lib/rpm/目录下的数据库档案中。这个目录内的数据十分重要,因为未来如果我们有任何软件需要升级的需求,版本之间的比较就是来自于这个数据库,而如果你想要查询系统已经安装的软件,也就是从这里查询。同时,目前的RPM也是提供数字签名的信息,这些数字签名也是在这个目录内记录。

确认网络的可行性:ipconfigeth0

X server的主要功能就是管理计算机上面的显示硬件和驱动程序。既然X window system是以透过网络取得图形接口的一个架构,那么客户端是如何取得服务器端提供的图形画面的呢?由于服务器和客户端的硬件不可能完全相同,因此我们客户端当然不可能使用到服务器端的硬件显示功能,举例来说,你的客户端计算机并没有3D影像加速功能,那么你的画面也不可能呈现出服务器端提供的3D加速功能,所以XSERVER的目的在于管理客户端的硬设备

Quotacheck 检查是否支持quota

Quotaon 启动磁盘配额

制作quota给用户:edquota

单一用户、群组的权限设定:ACL

由于安装预设格式化就已将加上ACL的文件系统功能的支持,因此你可以直接进行ACL的设定操作,但是你如果使用的是后来新增的partition或者是filesystem,或许需要在/etc/fstab内额外增加acl控制参数才行。

设定acl:setfacl

查看acl的设定:getfacl。

为了防止管理员对目录或者文件档案权限设定的疏忽,于是就有了SELinux。SELinux主要是控制细部的权限,它可以针对某些程序要读取的档案来设计SELinux类别,当程序与档案的类别形态可以相符合时,该档案才能开始被读取。如此一来,当你配置的文件权限为777,但是因为程序和档案的SELinux例行不符合,该程序还是读不到档案。

Lsattr 查阅档案的隐藏属性

Chattr来修订隐藏属性

一张网络卡可以设定多个IP

Dmesg可以查看核心侦测到的硬件信息

Lsmod查看载入到核心的驱动程序

Modinfo 查看驱动程序信息

不同的核心使用的驱动程序是不一样的,因此,更改核心之后,你自己编译的硬件驱动程序就需要重新编译了

Yum groupinstall ‘development tools’来安装组件

Yum grouplist 查看有的组件

将已将加载到内存的驱动程序卸载

Rmmod

设定网卡的IP地址:ifconfig eth0 192.168.1.100

所需要的网络参数:netmaskDHCP与否 gateway/etc/sysconfig/network-scripts/ifcfg-eth0

主机名:/etc/sysconfig/network

DNS IP:/etc/resolv.conf

私有IP对应的主机名称:/etc/hosts

/etc/services 记录架构在TCP/IP上面的种种协议,包括HTTP,FTP,SSH等服务所定义的端口号码

/etc/protocols

这个档案则是定义出IP封包协议的相关数据,包括ICMP/TCP/UDP方面的封包协议的定义等

/etc/init.d/network restart 这个script可以一口气重新启动整个网络的参数,他会主动去读取所有的网络配置文件,所以可以很快的恢复系统默认的参数值

Ifup eth0(ifdown eth0)启动或者关闭某个网络接口

Ifconfig 设定ip地址和掩码

Route –n设定网关

/etc/resolv.conf,他会影响到你是否可以查询主机名和ip地址的对应,也就是DNS功能。

查看dns是否能正常工作:dig www.google.com

修改主机名称就要修改/etc/sysconfig/network以及/etc/hosts两个档案

存放在ROM中的系统bios程序主要用于计算机开机时执行系统各部分的自检,建立起操作系统使用的各种配置表,例如中断向量表,硬盘参数表,并且把处理器和系统其余部分初始化到一个已知状态

系统调用中断是用户程序使用操作系统资源的唯一界面接口。系统调用是linux系统内核与上层应用程序进行交互通信的唯一接口。用户程序通过直接或者间接(通过库函数)调用中断Int 0X80,并且在eax寄存器中指定系统调用的功能号,就可以使用内核资源,包括系统内核资源,包括系统硬件资源。不过应用程序都是使用标准接口定义的C函数库中的函数间接使用内核的系统调用