资讯详情

Linux 相关基础笔记

Linux Baisc

History

Kernel version:

  • RHEL5 2.6.18
  • RHEL6 2.6.32
  • RHEL7 3.10

Bootup:

  • RHEL5 systemV格式系统初始化程序
  • RHEL6 upstart event-driven startup, 类似并行启动,无需东等,进程间使用dbus通信
  • RHEL7 systemd 完全使用并行初始化的过程, 参考 OS x

ChangeLog:

  • ifconfig deprecated from RHEL6, you must use ip a to check the Virtual IPs, and use ip -s link show link statistics
  • the old way to do virtual IPs was setup something like ifcfg-eth0:1. Now, just add to ifcfg-eth0, IPADDR2=., IPADDR3=.. But these don.t show up in .ifconfig

Userful link

SourceForge: http://www.sourceforge.org

sliceshare PPT 分享: http://www.slideshare.net

wordpress: http://www.wordpress.com

google code: http://code.google.com

用户管理

手动创建用户

用vim编辑/etc/passwd ,为新用户增加一个新行。
如果要创建新组,用vim 编辑/etc/group 。 
用mkdir 产生用户的主目录。 
将/etc/skel 中的文件复制到新的主目录中。 
用chown 和chmod 修改所有者和权限。 -R选项是最有用的。 
#cd /home/newusername #chown -R username.group . #chmod -R go=u,go-w . #chmod go= . 
用passwd设定口令。 
    最后一步设定完口令,这个帐户就能用了。
/etc/passwd:
	用户名:x:UID:基本组ID:comment信息:HOME:默认shell
/etc/shadow文件的格式:
	UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段
sp_namp - pointer to null-terminated user name
sp_pwdp - pointer to null-terminated password
sp_lstchg - days since Jan 1, 1970 password was last changed
sp_min - days before which password may not be changed
sp_max - days after which password must be changed
sp_warn - days before password is to expire that user is warned of pending password expiration
sp_inact - days after password expires that account is considered inactive and disabled
sp_expire - days since Jan 1, 1970 when account will be disabled
sp_flag - reserved for future use

修改root密码

密码改为root01

sed -i s/'^root:.*:\(.*\):\(.*\):\(.*\):\(.*\):\(.*\):\(.*\):\(.*\)'/"root:\$1\$3UEVsYK.\$bUg14pg\/vHYYUgR7hxzL.1:\1:\2:\3:\4:\5:\6:\7"/ /etc/shadow

echo nsadm|passwd --stdin root

LDAP

ldapadd

-x   进行简单认证
-D   用来绑定服务器的DN
-h   目录服务的地址
-w   绑定DN的密码
-f   使用ldif文件进行条目添加的文件

eg

ldapadd -x -D "cn=root,dc=starxing,dc=com" -w secret -f /root/test.ldif 
ldapadd -x -D "cn=root,dc=starxing,dc=com" -w secret  (这样写就是在命令行添加条目)

ldapsearch

-x   进行简单认证
-D   用来绑定服务器的DN
-w   绑定DN的密码
-b   指定要查询的根节点
-H   制定要查询的服务器

eg.

ldapsearch -x -D "cn=root,dc=starxing,dc=com" -w secret -b "dc=starxing,dc=com" 
使用简单认证,用 "cn=root,dc=starxing,dc=com" 进行绑定,要查询的根是 "dc=starxing,dc=com"。这样会把绑定的用户能访问"dc=starxing,dc=com"下的所有数据显示出来。
ldapsearch -x -W -D "cn=administrator,cn=users,dc=osdn,dc=zzti,dc=edu,dc=cn" -b "cn=administrator,cn=users,dc=osdn,dc=zzti,dc=edu,dc=cn" -h troy.osdn.zzti.edu.cn 
 ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.0.92:636 

ldapdelete

ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w secret "uid=test1,ou=People,dc=test,dc=com" 
ldapdelete -x -D 'cn=root,dc=it,dc=com' -w secert 'uid=zyx,dc=it,dc=com' 
这样就可以删除'uid=zyx,dc=it,dc=com'记录了,应该注意一点,如果o或ou中有成员是不能删除的。

ldappasswd

-x   进行简单认证
-D   用来绑定服务器的DN
-w   绑定DN的密码
-S   提示的输入密码
-s pass 把密码设置为pass
-a pass 设置old passwd为pass
-A   提示的设置old passwd
-H   是指要绑定的服务器
-I   使用sasl会话方式

eg.

#ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S
 New password:
 Re-enter new password: 
就可以更改密码了,如果原来记录中没有密码,将会自动生成一个userPassword。

ldapmodify

-a 添加新的条目.缺省的是修改存在的条目.
-C 自动追踪引用.
-c 出错后继续执行程序并不中止.缺省情况下出错的立即停止.比如如果你的ldif 文
   件内的某个条目在数据库内并不存在,缺省情况下程序立即退出,但如果使用了该参数,程
   序忽略该错误继续执行.
-n 用于调试到服务器的通讯.但并不实际执行搜索.服务器关闭时,返回错误;服务器
   打开时,常和-v 参数一起测试到服务器是否是一条通路.
-v 运行在详细模块.在标准输出中打出一些比较详细的信息.比如:连接到服务器的
   ip 地址和端口号等.
-M[M] 打开manage DSA IT 控制. -MM 把该控制设置为重要的.
-f file 从文件内读取条目的修改信息而不是从标准输入读取.
-x 使用简单认证.
-D binddn 指定搜索的用户名(一般为一dn 值).
-W 指定了该参数,系统将弹出一提示入用户的密码.它和-w 参数相对使用.
-w bindpasswd 直接指定用户的密码. 它和-W 参数相对使用.
-H ldapuri 指定连接到服务器uri(ip 地址和端口号,常见格式为
   ldap://hostname:port).如果使用了-H 就不能使用-h 和-p 参数.
-h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用.
-p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用.
    如果使用了-h 和-p 参数就不能使用-H 参数.
-Z[Z] 使用StartTLS 扩展操作.如果使用-ZZ,命令强制使用StartTLS 握手成功.
-V 启用证书认证功能,目录服务器使用客户端证书进行身份验证,必须与-ZZ 强制启用
   TLS 方式配合使用,并且匿名绑定到目录服务器.
-e 设置客户端证书文件,例: -e cert/client.crt
-E 设置客户端证书私钥文件,例: -E cert/client.key

eg

ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif 
将modify.ldif中的记录更新原有的记录。

find

-name "文件名称": 支持使用globbing

		*
		?
		[]
		[^]
	-iname "文件名称":查找时不区分字符大小写

	-user UserName: 根据属主查找
	-group GroupName: 根据属组查找

	-uid UID
	-gid GID

	-nouser:查找没有属主的文件;
	-nogroup: 查找没有属组的文件;

	组合条件:
		-a: 与,同时满足
		-o: 或,
		-not, !:非,取反

		非A,并且 非B: 非(A或B)

		-not ( -user hadoop -o -iname "*.txt" )

		非A,或 非B: 非(A且B)

	-type: 根据文件类型查找
		f: 普通文件
		d: 目录
		b: 块设备
		c: 字符设备
		l: 符号链接文件
		p: 命名管道
		s: 套接字

	-size: 根据文件大小查找
		-size [+|-]#Unit
			例如:-size +2M
			常用单位:k, M, G

			#: (#-1)<x<=#

	根据时间戳查找:
		以天为单位(time):
			-atime [+|-]#
				+: 表示(#+1)天之外被访问过;
				-: 表示#天之内被访问过;
				无符号:表示短于(#+1)> x >=#天的时间段被访问过;
			-mtime
			-ctime

		以分钟为单位(min):
			-amin [+|-]#
			-mmin
			-cmin
	根据权限查找:
		-perm [+|-]MODE
			MODE:精确匹配
			+MODE: 任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在;
			-MODE: 每类用户的指定要检查的权限位都匹配;

			文件权限:644
			-perm 600: 否
			-perm +222:
			-perm +002  
			-perm -444

find与xargs 在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

CPIO

【命令格式】

cpio [option][destination-directory]

【常用选项】

i:使用copy-in模式,还原归档文件或列出归档文件中的文件列表。

o:使用copy-out模式,建立归档文件。

p:使用copy-pass模式,将文件直接复制到目的目录。

c:使用老式的ASCII归档模式。如果需要跨平台使用,应该使用老式的ASCII归档格式。

d:创建需要的目录。如果文件不处于同一目录中,应该使用此选项。

v:显示处理过程的详细信息。

t:显示归档文件中的文件列表。

m:保持文件的时间戳记。

H:使用指定的格式归档文件

常常与find命令一同使用

find -print | cpio -ov >../backup.cpio

cpio -tv <backup.cpio

 

 

文件系统

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统.

创建文件系统

预留block空间

Reserving some number of filesystem blocks for use by privileged processes is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem

Inode

文件类型

与文件相关的硬链接个数

以字节为单位的文件长度

设备标识符

在文件系统中表示文件的索引节点号

文件拥有者的UID

文件的用户组ID

几个时间戳, 表示索引节点状态改变的时间, 最后访问时间及最后修改时间

访问权限和文件模式.

inode 0 is used as a NULL value, to indicate that there is no inode.
indoe 1 is used to keep track of any bad blocks on the disk; it is essentially a hidden file containing the bad blocks. Those bad blocks which are recorded using e2fsck –c
indoe 2 is used by the root directory which indicates starting of File system inodes

Block大小

1k, 最大单一档案限制 16GB, 最大文件系统总容量2TB

2k, 最大单一档案限制 256GB, 最大文件系统总容量8TB

4k, 最大单一档案限制2TB, 最大文件系统总容量16TB

文件描述符FD

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

uevent

Udev的工作是依赖于sysfs文件系统的,所以从内核版本2.6之后才开始支持udev。它基本可以替代2.4之后的devfs。

调用过程是内核空间通过netlinksocket跟用户空间交互,kenerl调用kobject-uevent()函数给用户空间发送netLink message来通知用户空间。

在用户空间,udev是启动一个守护进程叫做udevd(使用ps指令可以查看). 当uevent到达用户空间时,用户空间通过inotify的功能通知udevd。Udevd获得硬件更新信息,然后再根据/etc/udev.conf 以及/etc/udev/rules.d/* 下的规则进行设备定义,udev语法可以参考链接。

PS1. 可以模拟一个uevent的动作echo add > /sys/class/net/eth0/uevent来出发一个uevent消息。 

PS2. /etc/udev/rules.d/中的70-persistent-net.rules文件生成,是通过在/lib/udev/write_net_rules脚本来生成。

修改superblock

破坏superblock, 由于有boot sector的存在, 所以需要seek响应的位数

dd if=/dev/zero of=/dev/sda6 bs=1 count=1024 seek=1024

修复superblock

e2fsck -b 32768 /dev/sda6

文件类型

管道

管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统.

文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64 个文件(0 — 63)

这些代码从可执行文件载入到进程的地址空间执行。一般程序在用户空间执行当一个程序调用了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文。在此上下文中current宏是有效的。除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在用户空间继续执行。

Suid和Sticky

s :当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组ID)。

t:设置标志位(留在内存,不被换出)。如果该文件是目录,在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,在该文件执行后,指向其正文段(程序的代码)的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。

目录的S属性使得在该目录下创建的任何文件及目录属于该目录所拥有的组。

I/O重定向

INPUT:标准输入,stdin, 0 OUPUT: 标准输出,stdout, 1 标准错误:stderr, 2

输入重定向:<, <<

<: 输入重定向
<< EOF: 此处创建文件, Here Document
	常用于在脚本中创建文件或生成菜单

输出重定向:>, >>

>: 覆盖输出
>>: 追加输出
set -C:禁止使用覆盖重定向至已经存在的文件;
set +C: 关闭上述特性;
>|:在-C特性下,强制使用覆盖重定向;

/dev/null: bit bucket,位桶

同时重定标准输出和错误输出:

COMMAND > /path/to/outfile 2> /path/to/errfile
COMMAND &> /path/to/somefile
COMMAND > /path/to/somefile 2>&1 

集群文件系统

集群文件系统有GFS2(Redhat),OCFS2(Oracle)

内核相关

2.6之前的内核发布分为稳定版和测试版, 偶数次代表稳定版本, 奇次则不同.

可重入内核

reentrant: 若干个进程可以同时在内核态下执行. 当然在单处理器系统上只有一个进程在真正的运行

系统调用

open(path, flag, mode): 打开一个文件

flock(): 可以让进程在整个文件或部分文件上对I/O操作实施同步.

read(fd,buf,count), write(): 系统调用总是从文件指针的当前位置开始读或者写. 默认offset为0. Read()可以指定buf, 即指定进程地址空间中缓冲区的地址.

close(fd): 关闭文件

rename(oldpath,newpath): 修改文件名称

unlink(pathname): 修改文件链接的名字. 当一个文件的链接数为0, 则该文件被删除.

内核线程

是运行在内核态的特权进程. 它们以内核态运行在内核空间, 不予用户直接交互, 并且在系统启动时创建, 在系统关闭时关闭.

进程与线程

为了让内核管理进程, 每个进程都由一个进程描述符(process descriptor)表示. 当内核暂停一个进程的执行时, 就把几个处理器寄存器相关的内容保存在进程描述符中.

程序计数器(PC)和栈指针(SP)

通用寄存器

浮点寄存器

包含CPU状态信息的处理器控制寄存器(处理器状态字, processor status word)

用来跟踪进程对RAM访问的内存管理寄存器.

线程是进程的子单位, 在linux系统中并不支持原生态的线程, linux把所有线程当做进程来对待, 只不过将其当做轻量级进程来对待, LWP: light weight process. Linux 自身的线程库不同, 有内核自带的也有红帽提供的. Linux中的进程与线程响应I/O调用时的机制却是相同的

对于进程而言, 指令执行流是串行执行的. 而有了线程之后, 指令可以并行执行

进程切换需要保留现场, 以及还原现场. 保留指令指针, 数据要加载到CPU的缓存中. CPU的寄存器也要重置. 线程间切换, 由于数据共享, 则无需进行CPU的缓存清空

CPU的存储器是寄存器

32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息

CPU 忙等/闲等, 忙等不切换(使用自旋, spin lock), 闲等上下文切换

进程管理

使用命令 pmap -x 可以查看进程的内存占用信息; lsof -a -p 可以查看一个进程打开的文件信息。ps -Lf 可以查看进程的线程数。

另外procfs也是一个分析进程结构的好地方。procfs是一个虚拟的文件系统,它把系统中正在运行的进程都显现在/proc/目录下。

I/O模型

SELECT() 每次将所有的I/O请求的文件描述符扫一遍, 然后再将整个数据结构输给用户空间. 最多只支持1024个IO请求. 当内核发现有完成的IO调用后, 返回将所有内容返回

poll()没有上限限制, 但是性能跟select()差不多

1 . Blocking I/O: blocked all the way

2 . nonblocking I/O: if no data in buffer

3 . I/O multiplexing(select and poll): blocked separately in wait and copy

4 . Singal Driven I/O(SIGIO): nonblocked in wait but blocked in copy(signaled when I/O can be initiated) (epoll())

5 . asynchornous I/O(aio): nonblocked all the way(singaled when I/O is complete)

Synchronous I/O: 引起请求进程阻塞, 直到I/O完成

Asynchronous I/O:不导致请求进程阻塞

系统时间和用户时间

系统调用, 内核运行的时间成为系统时间. 用户空间内占用的时间, 称为用户时间.

系统指针大小, 32位的系统指针大小通常为32bytes, 64位系统通常大小为64bytes.

MMAP

系统调用mmap()可以将某文件映射至内存(进程空间),如此可以把对文件的操作转为对内存的操作,以此避免更多的lseek()与read()、write()操作,这点对于大文件或者频繁访问的文件而言尤其受益。

1、 Linux采用了投机取巧的分配策略,用到时,才分配物理内存。也就是说进程调用brk()或mmap()时,只是占用了虚拟地址空间,并没有真正占用物理内存。这也正是free –m中used并不意味着消耗的全都是物理内存。 2、 mmap()通过指定标志(flag) MAP_ANONYMOUS来表明该映射是匿名内存映射,此时可以忽略fd,可将它设置为-1。如果不支持MAP_ANONYMOUS标志的类unix系统,可以映射至特殊设备文件/dev/zero实现匿名内存映射。 3、 调用mmap()时就决定了映射大小,不能再增加。换句话说,映射不能改变文件的大小。反过来,由文件被映射部分,而不是由文件大小来决定进程可访问内存空间范围(映射时,指定offset最好是内存页面大小的整数倍)。 4、通常使用mmap()的三种情况.提高I/O效率、匿名内存映射、共享内存进程通信。

mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。

当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的内容.

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。

使用命令 pmap -x 可以查看进程的内存占用信息; lsof -a -p 可以查看一个进程打开的文件信息。ps -Lf 可以查看进程的线程数。

另外procfs也是一个分析进程结构的好地方。procfs是一个虚拟的文件系统,它把系统中正在运行的进程都显现在/proc/目录下。

IPC

(1) 半双工Unix管道 (2) FIFOs(命名管道) (3) 消息队列 (4) 信号量 (5) 共享内存 (6) 网络Socket

Modules

Linux的内核: 单内核, 支持动态装载和卸载

模块: /lib/modules/KERNEL_VERSION/

lspci

lsmod

modinfo MOD_NAME

modprobe -r MOD_NAME

rmmod MOD_NAME

modprobe MOD_NAME

insmod /path/to/module_file

Notes

不要对内核进行升级操作: 多版本内核可以并存, 因此,建议执行安装操作

硬件相关

Bios

BIOS芯片是主板上一块长方型或正方型芯片,在微机的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中。ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用。EPROM(Erasable Programmable ROM,可擦除可编程ROM)芯片可重复擦除和写入,解决了PROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。EPROM内资料的写入要用专用的编程器,并且往芯片中写内容时必须要加一定的编程电压(VPP=12—24V,随不同的芯片型号而定)。EPROM的型号是以27开头的,如27C020(8*256K)是一片2M Bits容量的EPROM芯片。EPROM芯片在写入资料后,还要以不透光的贴纸或胶布把窗口封住,以免受到周围的紫外线照射而使资料受损。由EPROM操作的不便,后来出的主板上BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程ROM。

BIOS中主要存放:   ● 自诊断程序:通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化;   ● CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;   ● 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统;   ● 主要I/O设备的驱动程序和中断服务: 由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强。

程序员可以通过INT5, INT13等中断的访问直接调用BIOS中断例程.

POST: Power on self test

磁盘相关

磁盘的识别机制

1 . Centos 5

​ IDE硬盘 -hd[abc..]#

​ SATA、SCSI、USB、SAS - sd[abc...]#

2 .Centos 6、7

​ IDE、SATA、SCSI、USB、SAS -sd[abc...] 查看内核中的主次设备号映射

cat /proc/devices

现在的 Linux 内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则

1、区分设备驱动程序控制的实际设备; 2、区分不同用途的设备 (misc 系列设备) 3、区分块设备的分区 (partition)

RAID

Level: 仅用于标识磁盘组合方式的不同 raid0, raid1, raid5, raid10, raid50, jbod

raid0: 至少需要两块磁盘,没有容错能力,读写性能都提升,100%

raid1: 至少需要两块磁盘,镜像,硬件容错能力,读性能提升,写性能下降,50%

raid4: 至少需要三块磁盘,允许一块盘出错,读写性能提升,(n-1)/n

raid5: 至少需要三块磁盘,允许一块盘出错,读写性能提升,(n-1)/n

raid6: 至少需要四块磁盘,允许两块盘出错,读写性能提升,(n-2)/n

raid10: 至少需要四块磁盘,允许不同组内各坏一块盘,读写性能提升,50% raid01

系统启动流程

POST --> BIOS(boot sequence) --> MBR (bootloader) --> Kernel (initrd, initramfs) --> /sbin/init (/etc/inittab)

init:

SysV init: /etc/inittab
upstart: /etc/inittab, /etc/init/*.conf
SystemD: OS X

1 .POST: 加电自检, ROM中的代码, CPU看到的存储存储空间为ROM+RAM, CPU寻找ROM要实现自举. 开机首先寻找ROM的地址, 主板商和CPU商约定俗成

2 .MBR:第0个扇区, 446bytes boot loader 64partition table 2: SA(标示是否有操作系统) bootloader要自行识别kernel所在磁盘的文件系统, kernel文件只能放在基本磁盘分区上, 最多放在raid1上, bootloader要在 /目录被挂载前找到vmlinux内核, 为找寻一个临时入口, bootloader会直接访问/vmlinuz将其作为根目录访问, vmlinuz会自解压到内存中, kernel自行进行初始化

3 .initrd帮助内核初始化, initrd是一个根文件系统, rd:ramdisk 将内存模拟成磁盘使用, 建立临时根,寻找模块使用/lib/module

4 ./sbin/init: /etc/rc.d/rc.sysinit脚本

GPT分区结构

GPT磁盘是指使用GUID分区表的磁盘。是源自EFI标准的一种较新的磁盘分区表结构的标准。与普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。

在GPT分区表的最开头(LBA0),处于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。

GPT分区表分为4个区域:GPT头、分区表、GPT分区、备份区。

  • GPT头:起始于磁盘的 LBA1,通常也只占用这个单一扇区。其作用是定义分区表的位置和大小。GPT头还包含头和分区表的校验和,这样就可以及时发现错误。
  • 分区表:分区表区域包含分区表项。这个区域由GPT头定义,一般占用磁盘LBA2~LBA33扇区。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值组成。分区表建立后,128位的GUID对系统来说是唯一的。
  • GPT分区:最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由GPT头定义。
  • 备份区:备份区域位于磁盘的尾部,包含GPT头和分区表的备份。它占用GPT结束扇区和EFI结束扇区之间的33个扇区。其中最后一个扇区用来备份1号扇区的EFI信息,其余的32个扇区用来备份LBA2~LBA33扇区的分区表

inittab

/sbin/init的配置文件:

每行定义一种操作:
	id: 操作的ID
	runlevels: 在哪些级别下执行此操作
	action: 动作
		initdefault: 设置默认运行级别,无需定义操作
		sysinit:指定系统初始化脚本
			si::sysinit:/etc/rc.d/rc.sysinit
		wait: 等待系统切换至此级别时运行一次;
		ctrlaltdel: 定义组合键被按下时要运行的命令;
		respawn: 当指定操作进程被关闭时立即再启动一次;
			tty1:2345:respawn:/sbin/mingetty tty1
	process: 操作
	
/etc/inittab中定义的操作:
	设定默认运行级别
	指定系统运行的初始化脚本
	启动指定级别下的要启动的服务,并关闭需要停止的服务
	定义CtrlAltDel组合的动作
	初始化字符终端
	启动图开终端

Redhat RC启动脚本

对于Redhat来说,执行的顺序为:

①/etc/rc.d/rc.sysinit             # 由init执行的第一个脚本

②/etc/rc.d/rc $RUNLEVEL          # $RUNLEVEL为缺省的运行模式

③/etc/rc.d/rc .local           # RUNLEVEL为2、3、5时运行

④/etc/rc.d/rc.serial            # $RUNLEVEL为1、3时初始化串口

​ /sbin/mingetty # 等待用户登录

系统初始化脚本rc.sysinit

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

设置主机名
打印文本欢迎信息
激活SELinux和udev
激活swap
挂载/etc/fstab定义的本地文件系统
检测根文件系统并对其以读写方式重新挂载
设置系统时钟
装载键盘映射
根据/etc/sysctl.conf设置内核参数
激活RAID和LVM设备
清理操作

GRUB

GRand Unified Bootloader

1st stage: 位于MBR中,为了引导2nd stage 1.5 stage: 位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展 2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序

boot分区大小:
	CentOS5: 100M
	CentOS6: 200M

grub接口:

title: 操作系统或内核的标题
	root: 设定内核文件所在的分区为grub的根
	kernel: 定义要使用的内核文件,后面可附加传递给内核的启动参数
	initrd: 指定为内核提供额外驱动等功能的ram disk或ram fs文件

init的级别1的表示方式:

1, s, single, S
单用户模式几乎不会启动任何服务,且不需要用户登录;但是会执行/etc/rc.d/rc.sysinit脚本;
如是连/etc/rc.d/rc.sysinit文件也不加载,则传递 emergency

grub.conf配置文件语法:

default=#: 指定默认启动的内核或OS;
timeout=#: 等待用户选择要启动的内核或OS的时长,单位为秒;
splashimage=/path/to/splashimage_file: 指定使用的背景图片
hiddenmenu: 隐藏菜单
title
	root (hd0,0)
		(Device, Part)
		Device表示方式: 在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标记,从0开始编号 
		Part表示方式:代表分区,从0开始编号
	kernel
		指定内核文件及传递给内核的参数
			参数:ro root=/path/to/DEVICE quiet
	initrd
		文件:通常为cpio归档,并使用gzip压缩;通常以.img作为文件名后缀;

runlevel

who -r

grub的安装

第一种方式

grub> root (hd#,#)
grub> setup (hd#)
grub> quit

第二种方式

chroot /mnt/sysimage
grub-install --root-directory=/ /dev/sda

制作Initrd

command mkinitrd

 mkinitrd [-v] [--with=模块名称] initrd档名 核心版本
选项与参数:
-v  :显示 mkinitrd 的运行过程
--with=模块名称:模块名称指的是模块的名字而已,不需要填写档名。举例来说,
       目前核心版本的 ext3 文件系统模块为底下的档名:
       /lib/modules/$(uname -r)/kernel/fs/ext3/ext3.ko
       那你应该要写成: --with=ext3 就好了 (省略 .ko)
initrd档名:你所要创建的 initrd 档名,尽量取有意义又好记的名字。
核心版本  :某一个核心的版本,如果是目前的核心则是『 $(uname -r) 』

编译操作系统

HOST: 宿主机

Target: 目标机

基于HOST制作一个简单的可启动的Linux:

1、给目标磁盘分区
	两个:
		宿主机上:/dev/sdb1, /dev/sdb2
		/dev/sdb1 挂载至 /mnt/boot
		/dev/sdb2 挂载至 /mnt/sysroot
2、安装grub至目标磁盘
	# grub-install --root-directory=/mnt /dev/sdb
3、复制内核和initrd文件
	# cp /boot/vmlinuz-VERSION  /mnt/boot/vmlinuz
	# cp /boot/initramfs-VERSION.img  /mnt/boot/initramfs.img
4、创建目标主机的根文件系统
	# mkdir -pv /mnt/sysroot/{etc/rc.d, usr, var, proc, sys, dev, lib, lib64, bin, sbin, boot, srv, mnt, media, home, root}
	接着去移植bash等至目标主机的根文件系统;
5、为grub提供配置文件
	# vim /mnt/boot/grub/grub.conf
	default=0
	timeout=5
	title MageEdu Little Linux
		root (hd0,0)
		kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
		initrd /initramfs.img

安装linux&&windows双系统

要先安装windows在给linux系统分区后安装linux. 因为windows的boot loader在安装时会覆盖原有的MBR内容, 导致linux无法被引导. 其次Windows并不支持安装在扩展分区上面.

Grub本身还可以监测到windows的存在,并且给与正确的配置

重启后强制fsck

touch /forcefsck

软件安装

RPM搜索站点:

https://pkgs.org/

http://www.rpmfind.net/

RPM Find RPM

VIM环境

修改VIM配置

set ts=4
set sw=4
set expandtab
set autoindent

set paste

Cygwin相关

svn --force export http://apt-cyg.googlecode.com/svn/trunk/ /bin/ 
chmod +x /bin/apt-cyg

Syntax:

"apt-cyg install <package names>" to install packages 
"apt-cyg remove <package names>" to remove packages 
"apt-cyg update" to update setup.ini 
"apt-cyg show" to show installed packages 
"apt-cyg find <pattern(s)>" to find packages matching patterns 
"apt-cyg describe <pattern(s)>" to describe packages matching patterns 
"apt-cyg packageof <commands or files>" to locate parent packages

restore_cyg_ssh.sh

#!/bin/bash                                                                                    
editrights -u cyg_server -a SeCreateTokenPrivilege                                             
editrights -u cyg_server -a SeTcbPrivilege                                                     
editrights -u cyg_server -a SeAssignPrimaryTokenPrivilege                                      
editrights -u cyg_server -a SeServiceLogonRight                                                 
                                                   ls
                                                   
editrights -u Administrator -a SeCreateTokenPrivilege                                          
editrights -u Administrator -a SeTcbPrivilege                                                  
editrights -u Administrator -a SeAssignPrimaryTokenPrivilege                                   
editrights -u Administrator -a SeServiceLogonRight                                                                                                                                
net start sshd 

BoldAsFont=-1
Locale=C
Charset=GBK
Printer=Foxit Reader PDF Printer
Transparency=medium
Columns=100
Rows=59
BackspaceSendsBS=yes
DeleteSendsDEL=yes
MiddleClickAction=void
RightClickAction=paste
Scrollbar=none
CursorType=underscore
Term=xterm
ForegroundColour=248,248,242
BackgroundColour=39,40,34
CursorColour=253,157,79
Black=39,40,34
BoldBlack=117,113,94
Red=249,38,114
BoldRed=204,6,78
Green=166,226,46
BoldGreen=122,172,24
Yellow=244,191,117
BoldYellow=240,169,69
Blue=102,217,239
BoldBlue=33,199,233
Magenta=174,129,255
BoldMagenta=126,51,255
Cyan=161,239,228
BoldCyan=95,227,210
White=248,248,242
BoldWhite=249,248,245

基础编程

Bash

通配符:

*: 匹配任意长度的任意字符
	abc, abb, abm, xab, ab
	ab*
	*ab
	*ab*:
?:匹配任意单个字符
[]: 匹配指定字符范围内的任意单个字符
	[xyz]
	[a-z]
	[A-Z]
	[0-9]
		[0-9a-zA-Z]
	[[:upper:]]   所有大写字母
	[[:lower:]]
	[[:alpha:]]
	[[:digit:]]
	[[:alnum:]]
	[[:space:]]
	[[:punct:]]
[^]: 匹配指定字符范围外的任意单个字符
	[^0-9], [^[:digit:]]

交互式登录: su -

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互时登录: su

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

正则表达式

基本正则表达式和扩展正则表达式

基本正则表式的元字符:grep -E

字符匹配:
	.: 任意单个字符
	[]: 指定范围内的任意单个字符
		[0-9], [[:digit:]]
		[a-z], [[:lower:]]
		[A-Z], [[:upper:]]
		[[:alpha:]]
		[[:alnum:]]
		[[:space:]]
		[[:punct:]]
	[^]:指定范围外的任意单个字符
次数匹配:用来指定匹配其前面的字符的次数
	*: 任意次
		例子:x*y, xxy, xy, y, 
		.*: 匹配任意长度的任意字符
	\?: 0次或1次
		x\?y, xy, y, xxy

		贪婪模式:尽可能的长的去匹配字符;
	\{m\}: 匹配m次
	\{m,n\}:
	\{m,\}: 至少m次;
	\{0,n\}:至多n次;
位置锚定:用于指定字符出现的位置
	^: 锚定行首
		^Char
	$: 锚定行尾
		char$
	^$: 空白行

	\<char: 锚定词首,\bchar
	char\>: 锚定词尾,char\b
分组:
	\(\)
		\(ab\)*xy
引用:
	\1: 后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容
	\2
	...
	\(a.b\)xy\1: a6bxya6b, 
He like his lover.
She love her liker.
He love his lover.
She like her liker.

Read隐藏密码

read -s -p "Please input your pgsql User pass

标签: ad1814jp集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台