存档

‘Linux入门大全’ 分类的存档

Linux系统启动过程详解

2017年1月24日 评论已被关闭

Linux系统启动过程详解  

 

1)BIOS自检

2)启动Grub/Lilo

3)加载内核

4)执行init进程

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

6)登陆Linux

 

1)BIOS自检:

 

a)POST(Power On Self Test),对硬件进行检测

计算机在通电后首先由BIOS进行自检,即所谓的POST(Power On Self Test),对硬件进行检测

依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入”引导块”

在PC中,Linux是从BIOS中的地址0xFFFF0处开始的

BIOS的第一个步骤是加电自检(POST),对硬件进行检测

第二个步骤是进行本地设备的枚举和初始化

BIOS由两部分组成: POST代码和运行时服务

当POST完成后,它从内存中清理出来,但BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务

要引导一个操作系统,BIOS运行时会按照CMOS的设置的顺序来搜索处于活动状态并可引导的设备:软盘、CD-ROM、硬盘上的分区、网络上的某个设备、USB(通常Linux是从硬盘引导的

主引导记录MBR中包含主引导加载程序。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区))当MBR被加载到RAM中之后,BIOS会把控制权交给MBR

b)提取MBR的信息

要看MBR的内容,请使用下面的命令

#从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中

[root@localhost pam.d]# dd if=/dev/sda of=mbr.bin bs=512 count=1

#以十六进制和ASCII码格式打印这个二进制文件的内容

[root@localhost pam.d]# od -xa mbr.bin

0000000 48eb 0090 d08e 00bc fb7c d88e b9fc 0080

k   H dle nul  so   P   < nul   |   {  so   X   |   9 nul nul

0000020 f48b 00bf 8e06 f3c0 a566 2fea 0006 1000

vt   t   ? nul ack  so   @   s   f   %   j   / ack nul nul dle

2)启动GRUB/Lilo:

 

GRUB和LILO都是引导加载程序,它们会引导操作系统。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(即MBR: master boot record)

3)加载内核:

 

当内核映像被加载到内存后,内核阶段就加开始了

内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或bzImage(较大的压缩映像,大于512KB),它是提前使用zlib进行压缩的

在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以后使用,然后此例程会调用内核,并开始启动内核引导的过程

在GRUB命令中,我们可以使用initrd映像引导一个特定的内核,方法如下:

grub> kernel /bzImage-2.6.14.2

[Linux-bzImage, setup=0x1400, size=0x29672e]

grub>initrd /initrd-2.6.14.2.img

[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot

Uncompressing Linux… Ok, booting the kernel.

如果不知道要引导的内核的名称,只需使用/然后按下Tab键,就会显示内核和initrd映像列表

对grub命令行进行加密

a)使用命令/sbin/grub-md5-crypt来产生grub使用的密码

[root@localhost pam.d]# /sbin/grub-md5-crypt

Password:

Retype password:

$1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1

b)修改/etc/grub.conf加入password –md5 $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1 一定要放在title之前

这样重启系统时在grub的启动grub菜单时,想再按e命令进行编辑时,必须先按p键后输入密码才成

 

4)执行init进程:

 

init进程是所有进程的起点,内核在完成内核引导后,即在本线程(进程)空间内加载init程序,它的进程号为1

init进程是所有进程的发起者和控制者

init进程有两个作用:

扮演终结父进程的角色:所有的孤儿进程都会被init进程接管

进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理,这个作用由/etc/inittab文件定义的

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

 

init进程的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等,对于RedHat来说,按以下顺序执行

a)执行/etc/rc.d/rc.sysinit(由init执行的第一个脚本)

此步可进行的工作有:

设置$PATH变量

配置网络

为虚拟内存启动交换

设置系统的主机名

检查root文件系统,以进行必要的修复

检查root文件系统的配额

为root文件系统打开用户和组的配额

以读/写的方式重新装载root文件系统

清除被装载的文件系统表/etc/matb

把root文件系统输入到mtab

使用系统为装入模块做准备

查找模块的相关文件

检查文件系统,以进行必要的修复

加载所有其他文件系统

清除几个/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin

删除UUCP的lock文件

删除过时的子系统文件

删除过时的pid文件

设置系统时钟

打开交换

初始化串行端口

装入模块

 

b)执行/etc/rc.d/rcX.d[KS]

首先终止K开头的服务(用来关闭一个服务),然后启动S开头的服务(用来启动一个服务)

对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。

这些运行级别的下级子目录的命名方法上rcX.d, 其中X就是代表运行级别的数字

在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接

链接的名称在K与S后有一个数字,表示执行顺序,数字小的先执行如K01tog-pegasus  、 S00microcode_ctl

对以K开头的脚本执行时系统会传递stop参数,而S开头的脚本系统会传递start参数

 

c)执行/etc/rc.d/rc.local

Redhat中运行模式2,3,5都把/etc/rc.d/rc.local作为初始化脚本中的最后一个文件,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登陆之前执行的命令

 

6)执行/bin/login:

 

login程序会提示使用者需输入帐号与密码,接着编码并确认密码的正确性,若二者相合,则为使用者进行初始化环境,并将控制权交给shell,即等用户登录。

分类: Linux入门大全 标签:

常用端口简介

2017年1月17日 评论已被关闭

常用端口简介

1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。
2) 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
3) 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始

用端口对照
端口:0
服务:Reserved
说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。
端口:1
服务:tcpmux
说明:这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。Irix机器在发布是含有几个默认的无密码的帐户,如:IP、GUEST UUCP、NUUCP、DEMOS 、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。
端口:7
服务:Echo
说明:能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。
端口:19
服务:Character Generator
说明:这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。
端口:20、21
服务:FTP
说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。
端口:22
服务:Ssh
说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。
端口:23
服务:Telnet
说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。
端口:25
服务:SMTP
说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。

端口:31
服务:MSG Authentication
说明:木马Master Paradise、Hackers Paradise开放此端口。
端口:42
服务:WINS Replication
说明:WINS复制
端口:53
服务:Domain Name Server(DNS)
说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。
端口:67
服务:Bootstrap Protocol Server
说明:通过DSL和Cable modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址。HACKER常进入它们,分配一个地址把自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址。

端口:69
服务:Trival File Transfer
说明:许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何 文件。它们也可用于系统写入文件。
端口:79
服务:Finger Server
说明:入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描。
端口:80
服务:HTTP
说明:用于网页浏览。木马Executor开放此端口。

端口:88
说明:Kerberos krb5。另外TCP的88端口也是这个用途。
端口:99
服务:Metagram Relay
说明:后门程序ncx99开放此端口。
端口:102
服务:Message transfer agent(MTA)-X.400 over TCP/IP
说明:消息传输代理。
端口:109
服务:Post Office Protocol -Version3
说明:POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交 换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。

端口:110
服务:SUN公司的RPC服务所有端口
说明:常见RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等
端口:113
服务:Authentication Service
说明:这是一个许多计算机上运行的协议,用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与E-MAIL服务器的缓慢连接。许多防火墙支持TCP连接的阻断过程中发回RST。这将会停止缓慢的连接。

端口:119
服务:Network News Transfer Protocol
说明:NEWS新闻组传输协议,承载USENET通信。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM。
端口:135
服务:Location Service
说明:Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111端口的功能很相似。使用DCOM和RPC的服务利用计算机上的end-point mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。HACKER扫描计算机的这个端口是为了找到这个计算机上运行Exchange Server吗?什么版本?还有些DOS攻击直接针对这个端口。
端口:137、138、139
服务:NETBIOS Name Service
说明:其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。
端口:143
服务:Interim Mail Access Protocol v2
说明:和POP3的安全问题一样,许多IMAP服务器存在有缓冲区溢出漏洞。记住:一种LINUX蠕虫(admv0rm)会通过这个端口繁殖,因此许多这个端口的扫描来自不知情的已经被感染的用户。当REDHAT在他们的LINUX发布版本中默认允许IMAP后,这些漏洞变的很流行。这一端口还被用于IMAP2,但并不流行。

端口:161
服务:SNMP
说明:SNMP允许远程管理设备。所有配置和运行信息的储存在数据库中,通过SNMP可获得这些信息。许多管理员的错误配置将被暴露在Internet。Cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络。
端口:162
说明:SNMP Trap(SNMP陷阱)

端口:177
服务:X Display Manager Control Protocol
说明:许多入侵者通过它访问X-windows操作台,它同时需要打开6000端口。
端口:389
服务:LDAP、ILS
说明:轻型目录访问协议和NetMeeting Internet Locator Server共用这一端口。
端口:443
服务:Https
说明:网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP。
端口:445
说明:Common Internet File System(CIFS)(公共Internet文件系统)
端口:456
服务:[NULL]
说明:木马HACKERS PARADISE开放此端口。
端口:464
说明:Kerberos kpasswd(v5)。另外TCP的464端口也是这个用途。

分类: Linux入门大全 标签:

tcp不能保证数据传输的万无一失

2017年1月16日 评论已被关闭

tcp不能保证数据传输的万无一失
http://www.cppblog.com/isware/archive/2011/07/21/151548.html
■tcp认识的误区
应用开发人员常常遇到这样的困惑:为什么用tcp写的应用还会出现数据丢失呢?很多人都以为tcp 协议可以确保数据的传输,但事实上没有任何一种协议可以做到这一点。tcp所能做只是传输数据,如果失败了,它会通知你,但它无法告诉你有多少数据没有被正确传送。

tcp 协议中的应答机制使得发送方的tcp栈确保接收方tcp栈收到了数据。

tcp包头包括32位的顺序码和应答码,顺序码是在连接建立时随机产生的,并随着传输的字节数递增。当数据被接收时,接收方的tcp栈会给发送方发送应答码, 如果发送方没收到应答码, 它就会重发该数据。发方和收方的顺序码是各自独立的。
■tcp是一个窗口式的协议
tcp是一个窗口式的协议。tcp包头数据中也包含窗口的大小,它告诉远端再传多少数据后就必须停止。窗口大小实际上就是缓存区的大小,当缓冲区满的 时候,窗口就会关闭。当发送方收到的应答中窗口大小为零时,它会自动停止发送。发送方会记住自己发送了多少数据,即使没有收到窗口大小为零的应答,它也不 会发送大于缓冲区的数据。

通常接收方应答这些数据时,应用会不断读数据,这样窗口就经常处于开放状态。

导致窗口关闭的最常见原因是i/o阻塞。这通常是临时性的,一般i/o通畅后,缓存(窗口)会自动开放。第二个原因就是应用代码中的bug使得接收应用程序忽略了连接,重要的不在于接收方读没读数据,而在于发送方在收到应答后是否正确地发送了数据。
■tcp的缓存机制
发送tcp栈在收到应答前必须对数据进行缓存,而应用程序在调用tcp栈发送数据时并不知道数据已经在缓存区了。只要发送tcp栈还有空间,它就会接收来自应用的数据并进行缓存。一旦缓存满了导致应用程序无法继续发送,它就会认为有问题了。

如果问题是发送tcp栈没有收到应答,那么它会重发,等待应答的时间会越来越长,直至最终放弃并重新建立连接。重新连接后本地缓存会清空,并通知应用 程序。但是至于有多少数据在缓存区没有收到应答仍不得而知。本地tcp栈无法知道远端是否收到了数据,也不知道是否收到了远端应答。

如果问题是窗口关闭了,那么发送tcp栈会定期发送窗口探针来探测接收方窗口是否开放。接收tcp栈必须应答窗口探针包。应答包含当前窗口大小。在收到探针应答前,发送tcp栈只能等待。
■路在何方
也许有人会说:既然如此,为何还要用tcp协议?如果应用中必须包括数据标识和应答,为什么不用udp协议?tcp的优势在于你不必担心数据传输机 制,如果数据包在传输过程中由于路由的关系,其到达顺序被打乱,接收tcp栈会将这些数据包按其顺序码重新排列,从而保证了数据的正确性。而如果采用 udp的话,则应用中必须设法提供所有这些机制。

如果发生了传输线路中断,仅有应用层的应答是不够的。按照应用层应答机制,在重建连接后,发送方会重发那些没有收到应答的数据包,但是有可能虽然这些 应答丢了,可数据却到达了,并已用于应用程序。为了防止这种情况,发送应用方需保存没被接收应用应答的数据段的标识 ,接收应用方也应保存自己已接收和处理过的数据段的标识。当重建连接时,发送方将发送第一个没有收到应答的数据段,或者询问接收方最后发出的应答进行确 认。为了确保数据传输的无误, 应该保证接收应用方保存的数据段标识在应用重启或系统瘫痪时仍能安然无恙。

尽管tcp协议十分优秀,但它并不能确保数据数据传输万无一失。

分类: Linux入门大全 标签:

linux下检测端口是否连通

2016年11月10日 评论已被关闭
分类: Linux入门大全 标签:

linux进程后台运行的几种方式

2016年11月5日 评论已被关闭

linux进程后台运行的几种方式
http://seanlook.com/2014/02/20/linux-process-running-background-screen/
Ctrl+z/bg/nohup/setsid/&
在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:
# ./rsync.sh &
# jobs
对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:bg %1,放回前台运行:%1。

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1):
# nohup ./rsync.sh &
# setsid ./rsync.sh &

# (./rsync.sh &) ////在一个subshell中执行
# ps -ef|grep rsync
nohup 的用途就是让提交的命令忽略 hangup 信号,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用” > log.out 2>&1”来更改缺省的重定向文件名。

上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:
# jobs
# disown -h %1
# ps -ef|grep rsync
效果与setid相同,但是disown后无法通过jobs命令查看了。

screen
还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便。

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换,可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
# yum install screen -y
常用screen参数:
# screen -S docker-d 新建一个名叫docker-d的session,并马上进入
# screen -dmS docker-d 新建一个名叫docker-d的session,但暂不进入,可用于系统启动脚本里
# screen -ls 列出当前所有session
# screen -r docker-d 恢复到zhouxiao这个session,前提是已经是断开状态(-d可以远程断开会话)
# screen -x docker-d 连接到离线模式的会话(多窗口同步演示)
# screen ./rsync.sh screen创建一个执行脚本的单窗口会话,可以attach进程ID
# screen -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业
正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a w 显示所有窗口列表
C-a k 这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
C-a d detach,暂时离开当前session
需要了解的是,一个用户创建的screen,其他用户(甚至root)通过screen -ls是看不见的。另外,Ctrl+a在bash下是用来回到行开头,不幸与上面的组合快捷键冲突。

上面只是基本也是最常用的用法,更多请参考man screen或linux screen 命令详解。
http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

分类: Linux入门大全 标签:

Linux tar 如何在压缩之后删除原文件

2016年6月6日 评论已被关闭

Linux tar 如何在压缩之后删除原文件
http://blog.csdn.net/wide288/article/details/9159255
假设我们压缩文件文件aaa.log 为aaa.log.tar.gz ,归档压缩之后,并删除文件aaa.log。请参阅下面的命令:

tar -zcvf aaa.log.tar.gz aaa.log –remove-files

可以看出,主要是使用了–remove-files 这个命令参数选项。
能不能拓展下:解压 aaa.log.tar.gz之后,并删除 aaa.log.tar.gz?我看了一遍又一遍帮助,一直没有发现合适的命令参数选项。不过,完全可以通过一种变通的方法来实现:

tar -zxvf aaa.txt.tar.gz && rm -rf aaa.txt.tar.gz
对于上面两种应用,是不是可以进一步拓展出以下两种比较有实际意义的应用:
1、遍历压缩归档日志文件:

find . -name “*.log” -type f -exec tar -zcvf {}.tar.gz {} –remove-files > /dev/null \;
2、遍历解压tar.gz文件,并删除tar.gz文件

find . -name “*.tar.gz” -type f -exec tar -zxvf {} \; -exec rm -rf {} \; > /dev/null

分类: Linux入门大全 标签:

CLOSE_WAIT状态的原因与解决方法

2016年6月3日 评论已被关闭

CLOSE_WAIT状态的原因与解决方法
http://blog.chinaunix.net/uid-20357359-id-1963662.html
这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面到到了这个问题,不得不使我开始关注这个问题。说起CLOSE_WAIT状态,如果不知道的话,还是先瞧一下TCP的状态转移图吧。
关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。将关闭部分的状态转移摘出来,就得到了下图:
产生原因
通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢?
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。
通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。

出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

参考资料4中描述,通过发送SYN-FIN报文来达到产生CLOSE_WAIT状态连接,没有进行具体实验。不过个人认为协议栈会丢弃这种非法报文,感兴趣的同学可以测试一下,然后把结果告诉我;-)

为了更加清楚的说明这个问题,我们写一个测试程序,注意这个测试程序是有缺陷的。
只要我们构造一种情况,使得对方关闭了socket,我们还在read,或者是直接不关闭socket就会构造这样的情况。
server.c:
#include
#include
#include

#define MAXLINE 80
#define SERV_PORT 8000

int main(void)
{
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;
int listenfd, connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i, n;

listenfd = socket(AF_INET, SOCK_STREAM, 0);

int opt = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

listen(listenfd, 20);

printf(“Accepting connections …\n”);
while (1) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,
(struct sockaddr *)&cliaddr, &cliaddr_len);
//while (1)
{
n = read(connfd, buf, MAXLINE);
if (n == 0) {
printf(“the other side has been closed.\n”);
break;
}
printf(“received from %s at PORT %d\n”,
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));

for (i = 0; i < n; i++)
buf[i] = toupper(buf[i]);
write(connfd, buf, n);
}
//这里故意不关闭socket,或者是在close之前加上一个sleep都可以
//sleep(5);
//close(connfd);
}
}
client.c:
#include
#include
#include
#include
#include
#include

#define MAXLINE 80
#define SERV_PORT 8000

int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n;
char *str;

if (argc != 2) {
fputs(“usage: ./client message\n”, stderr);
exit(1);
}
str = argv[1];

sockfd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, “127.0.0.1”, &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);

connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

write(sockfd, str, strlen(str));

n = read(sockfd, buf, MAXLINE);
printf(“Response from server:\n”);
write(STDOUT_FILENO, buf, n);
write(STDOUT_FILENO, “\n”, 1);

close(sockfd);
return 0;
}

结果如下:
debian-wangyao:~$ ./client a
Response from server:
A
debian-wangyao:~$ ./client b
Response from server:
B
debian-wangyao:~$ ./client c
Response from server:
C
debian-wangyao:~$ netstat -antp | grep CLOSE_WAIT
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        1      0 127.0.0.1:8000          127.0.0.1:58309         CLOSE_WAIT  6979/server
tcp        1      0 127.0.0.1:8000          127.0.0.1:58308         CLOSE_WAIT  6979/server
tcp        1      0 127.0.0.1:8000          127.0.0.1:58307         CLOSE_WAIT  6979/server
解决方法
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

1.代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,也断开连接。(注:在UNP 7.5节的图7.6中,可以看到使用select能够检测出对方发送了FIN,再根据这条规则就可以处理CLOSE_WAIT的连接)
2.给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3.使用一个Heart-Beat线程,定期向socket发送指定格式的心跳数据包,如果接收到对方的RST报文,说明对方已经关闭了socket,那么我们也关闭这个socket。
4.设置SO_KEEPALIVE选项,并修改内核参数

前提是启用socket的KEEPALIVE机制:
//启用socket连接的KEEPALIVE
int iKeepAlive = 1;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *)&iKeepAlive, sizeof(iKeepAlive));

tcp_keepalive_intvl (integer; default: 75; since Linux 2.4)
The number of seconds between TCP keep-alive probes.

tcp_keepalive_probes (integer; default: 9; since Linux 2.2)
The  maximum  number  of  TCP  keep-alive  probes  to  send before giving up and killing the connection if no response is obtained from the other end.

tcp_keepalive_time (integer; default: 7200; since Linux 2.2)
The number of seconds a connection needs to be idle before TCP begins sending out  keep-alive  probes.   Keep-alives  are only  sent when the SO_KEEPALIVE socket option is enabled.  The default value is 7200 seconds (2 hours).  An idle connec‐tion is terminated after approximately an additional 11 minutes (9 probes an interval of 75  seconds  apart)  when  keep-alive is enabled.

echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes

除了修改内核参数外,可以使用setsockopt修改socket参数,参考man 7 socket。
int KeepAliveProbes=1;
int KeepAliveIntvl=2;
int KeepAliveTime=120;
setsockopt(s, IPPROTO_TCP, TCP_KEEPCNT, (void *)&KeepAliveProbes, sizeof(KeepAliveProbes));
setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&KeepAliveTime, sizeof(KeepAliveTime));
setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&KeepAliveIntvl, sizeof(KeepAliveIntvl));
参考:
http://blog.chinaunix.net/u/20146/showart_1217433.html
http://blog.csdn.net/eroswang/archive/2008/03/10/2162986.aspx
http://haka.sharera.com/blog/BlogTopic/32309.htm
http://learn.akae.cn/media/ch37s02.html
http://faq.csdn.net/read/208036.html
http://www.cndw.com/tech/server/2006040430203.asp
http://davidripple.bokee.com/1741575.html
http://doserver.net/post/keepalive-linux-1.php
man 7 tcp

分类: Linux入门大全 标签:

linux的一些核心配置文件

2016年5月18日 评论已被关闭

linux的一些核心配置文件

http://www.cnblogs.com/dkblog/archive/2011/08/30/2160190.html

Linux下的主要文件:
/bin:bin是binary的缩写。这个目录是对UNIX系统习惯的沿袭,存放着使用者最经常使用的命令。例如:cp,ls,cat。
/boot:这里存放的是启动LINUX时使用的一些核心文件。
/dev:dev是device(设备)的缩写。这个目录下是所有LINUX的外部设备,其功能类似DOS下的.sys和Win下的.vxd。在LINUX中设备和文件是用同种方法访问的。例如:/dev/hda代表第一个物理IDE硬盘。
/etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home:用户的主目录,比如说有个用户叫wang,那他的主目录就是/home/wang也可以用~wang表示,说到这里,打个岔,你现应该明白在我们访问一些个人网页(如http://www.netease.net/~zhangjia)的时候,~zhangjia就是表示访问www.netease.net站点中的用户zhangjia的用户主目录。
/lib:这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found:这个目录平时是空的,当系统不正常关机后,这里就成了一些无家可归的文件的避难所。对了,有点类似于DOS下的.chk文件。
/mnt:这个目录是空的,系统提供这个目录是让用户临时挂载别的文件系统。
/proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里啊!?
/root:系统管理员,也叫作超级权限者的用户主目录。当然系统的拥有者,总要有些特权啊!
/sbin:s就是Super User的意思,也就是说这里存放的是一些系统管理员使用的系统管理程序。
/tmp:这个目录不用说,一定是用来存放一些临时文件的地方了。
/var:这个目录中存放着那些不断在扩充着的东西,为了保持/usr的相对稳定,那些经常被修改的目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在/var/log目录中
/usr:这是个最庞大的目录,我们要用到的很多应用程序和文件几乎都存放在这个目录下。具体来说:
/usr/X11R6   存放X-Windows的目录;
/usr/bin     存放着许多应用程序;
/usr/sbin    给超级用户使用的一些管理程序就放在这;
/usr/doc     这就是LINUX文档的大本营;
/usr/include LINUX下开发和编译应用程序需要的头文件,在这找;
/usr/lib     存放一些常用的动态链接共享库和静态档案库;
/usr/local   这是提供给一般用户的/usr目录,在这安装软件最适合;
/usr/man     man是什么,对了是帮助。这里就是帮助文档目录啊!
/usr/src     LINUX开放的源代码,就存在这个目录,爱好者们别放过哦!

/boot/grub/grub.conf GRUB 引导器配置文件
/boot/module-info-* Linux 核心模块信息
/boot/System.map-* Linux 系统影像文件
/boot/vmlinuz-* Linux 核心

/etc/aliases 邮件别名
/etc/at.deny 记录哪些用户静止使用 at 命令
/etc/auto.master 配置 autofs 程序,使之能自动装入文件系统
/etc/auto.misc automounter 的影像文件
/etc/bashrc bash shell 的系统全局配置
/etc/cron.daily/* 每天需要执行的命令
/etc/cron.hourly/* 每个小时需要执行的命令
/etc/cron.monthly/* 每个月需要执行的命令
/etc/cron.weekly/* 每周需要执行的命令
/etc/crontab cron 系统配置文件,配置指定时间执行命令
/etc/cups/* 打印机配置文件
/etc/default/useradd useradd 命令默认的配置(用来增加新用户用)
/etc/DIR_COLORS 用彩色方式列出文件的颜色配置文件
/etc/exports 指定 NFS 需要导出的文件系统
/etc/filesystems 所支持的文件系统
/etc/fstab 指定文件系统的载入点
/etc/group 系统用户组的定义文件
/etc/host.conf 主机配置文件
/etc/hosts 主机名字和IP的影像文件
/etc/hosts.allow 定义允许访问本机的主机
/etc/hosts.deny 定义禁止访问本机的主机
/etc/httpd/conf/* Apache 配置文件
/etc/httpd/httpd.conf Apache 主配置文件
/etc/init.d/* SysV 初始化脚本
/etc/initlog.conf 用户登陆配置文件
/etc/inittab 配置 init ,用来执行命令 系统启动后为图形界面or文本界面
/etc/issue 显示Linux核心的发行版本信息(用于本地登陆用户)
/etc/issue/net 显示Linux核心和发行版本信息(用于远程登陆用户)
/etc/ld.so.conf 共享库配置文件
/etc/login.defs useradd 和 related 命令的配置文件
/etc/mail/* 邮件服务器配置文件
/etc/mailcap 邮件 MIME 头信息
/etc/man.config man 命令配置文件
/etc/mime.types 定义 MIME 类型
/etc/mime-magic* MIME 数据的 Magic 数
/etc/minicom.users 定义哪些用户ID可以使用 minicom
/etc/modules.conf Linux 核心模块配置文件
/etc/motd Message of the day (登陆以后显示里面的内容)
/etc/mtab 显示已装入的文件系统
/etc/nsswitch.conf Resolver 配置文件
/etc/openldap/* Open LDAP 配置文件
/etc/pam.d/* PAM 配置文件
/etc/paper.config 定义纸张的大小
/etc/passwd 帐户配置文件
/etc/ppp/* PPP 配置文件
/etc/printcap 打印机选项和配置文件
/etc/profile bash shell 的默认启动文件
/etc/profile.d/* Shell 初始化文件
/etc/protocols 显示网络协议想对应的内容
/etc/pwdb.conf pwdb 库配置文件
/etc/rc 系统启动和关闭的脚本
/etc/rc.local 本地启动时需要执行的脚本
/etc/rc.sysinit 系统初始化脚本
/etc/rc?.d/* 系统服务启动或者停止的脚本
/etc/rpc 定义 RPC 程序对应的端口
/etc/rpm/* RPM 数据库和配置文件
/etc/samba/* Samba 配置文件
/etc/securetty Secure tty 配置文件
/etc/security/* PAM 配置文件
/etc/sensors.conf libsensors 配置文件
/etc/services 定义默认的服务名字和与此向对应的端口
/etc/shadow 用户帐户信息(使用 shadow 加密)
/etc/skel 系统骨干文件,用来建立新的用户
/etc/ssh/* SSH 配置文件
/etc/sysconfig/* 系统配置文件
/etc/sysconfig/network-scripts/* 网络适配器配置文件(用来启动新的网络接口用)
/etc/sysctl.conf sysctl 配置文件
/etc/syslog.conf 系统日志配置文件
/etc/termcap 终端定义和配置文件
/etc/updatedb.conf 系统升级程序的配置文件(估计时 RH 专用的)
/etc/wvdial.conf 字符界面下的拨号工具配置文件
/etc/X11/applnk/* 定义 X 对象
/etc/X11/fs/config X 字体配置文件
/etc/X11/gdm/* GNOME 登陆器配置文件
/etc/X11/xdm/* X 登陆器的配置文件
/etc/X11/XF86Config X 主要配置文件
/etc/X11/xinit/Xclients xinit 默认的配置文件
/etc/X11/xinit/xinitrc X 初始化文件
/etc/X11/Xmodmap 定义 xdm 和 xinit 所要使用的键盘映射
/etc/xinetd.conf xinetd 配置文件
/etc/xinetd.d 定义 xinetd 中使用的一些特殊的服务

~/public_html 用户公共的网页文件(可以在 apache 配置)
~/.bash_history 用户 bash 的历史命令
~/.bash_logout 定义 bash 用户退出时所执行的命令
~/.bash_profile 用户 bash 初始化文件
~/.bashrc 用户 bash 的全局配置文件
~/.Xresources 定义用户的 X 资源设置

/usr/share/fonts/* 字体
/usr/share/ssl/openssl.cnf SSL 连接配置
/usr/X11R6/lib/X11/app-defaults/* X 默认的对象
/usr/X11R6/lib/X11/fonts/* X 字体

/var/log/cron 记录 cron 执行日志
/var/log/httpd/access_log apache 流量日志
/var/log/httpd/error_log apache 运行错误日志
/var/log/boot.log 系统启动日志
/var/log/cron 系统核心日志
/var/log/dmesg Linux 核心消息日志
/var/log/lastlog 记录最后用户登陆
/var/log/maillog 邮件传输日志
/var/log/messages 系统日志
/var/log/samba/* Samba 运行日志
/var/log/secure 系统安全日志
/var/log/up2date Up2date 升级程序日志

/var/www/cgi-bin CGI 脚本
/var/www/html/ apache 程序默认的网页根目录

分类: Linux入门大全 标签:

TCP不会造成IP分片,而UDP和ICMP则会造成IP分片

2016年5月16日 评论已被关闭

TCP不会造成IP分片,而UDP和ICMP则会造成IP分片

http://www.2cto.com/net/201308/235363.html

TCP不会造成IP分片,而UDP和ICMP则会造成IP分片
为什么TCP不会造成IP分片呢?原因是TCP自身支持分段:当TCP要传输长度超过MSS(Maxitum Segment Size)的数据时,会先对数据进行分段,正常情况下,MSS小于MTU,因此,TCP一般不会造成IP分片。
而UDP和ICMP就不支持这种分段功能了,UDP和ICMP认为网络层可以传输无限长(实际上有65535的限制)的数据,当这两种协议发送数据时,它们不考虑数据长度,仅在其头部添加UDP或ICMP首部,然后直接交给网络层就万事大吉了。
接着网络层IP协议对这种“身长头短”的数据进行分片,不要指望IP能很“智能”地识别传给它的数据上层头部在哪里,载荷又在哪里,它会直接将整个的数据切成N个分片,这样做的结果是,只有第一个分片具有UDP或者ICMP首部,而其它分片则没有。
详细如下图:

ssh详细登录过程

2016年5月13日 评论已被关闭

ssh详细登录过程

 http://blog.csdn.net/gsnumen/article/details/7293266

首先说下相关概念:

明文:需要秘密传送的消息。
密文:明文经过密码变换后的消息。
加密:由明文到密文的变换。
解密:从密文恢复出明文的过程。
破解:非法接收者试图从密文分析出明文的过程。
加密算法:对明文进行加密时采用的一组规则。
解密算法:对密文进行解密时采用的一组规则。
密钥:加密和解密时使用的一组密码信息。
对称加密:是采用单钥密码系统的加密方法,使用同一密钥对信息进行加密和解密的加密方法。
非对称加密:需要两个密钥:公共密钥和私有密钥,它们成对出现,公钥加密的数据有且只有私钥能解密,私钥加密的数据有且只有公钥解密,相对于“对称加密”,“非对称加密”加密方法加密和解密使用不同的密钥,所以叫“非对称加密”加密方法。
对称加密和非对称加密的区别:在于加密和解密是否使用的同一个密钥。
加密、身份认证、数字签名认证:
     加密:将数据资料加密,使得非法用户即便获取加密后的资料,也无法获取正确的资料内容,所以数据加密可以保证数据防止监听攻击;其重点在于数据的安全性。
    身份认证:判断某身份的真实性,确认身份后,系统才可以依不同的身份赋予不同的权限;其重点在于用户的真实性。
    数字签名认证:首先”数字签名”就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许接收者判断数据的来源和数据的完整性,防止被伪造篡改。数字签名认证侧重于把保证数据的完整性,防止被伪造和篡改。
 

认证原理:

有2种认证方式:

    基于账号和口令的验证方式 和 基于公钥和私钥的验证方式

ssh的登录过程分为5个阶段

    1、版本号协商阶段
    2、密钥和算法协商阶段
    3、认证阶段
    4、会话请求阶段
    5、会话交互阶段

1、版本号协商阶段

    服务端打开端口22,等待客户连接。
    客户端向服务端发起TCP连接,连接建立后,服务端向客户端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。
    客户端收到报文后,解析协议版本号,如果服务端的协议版本号比自己的低,且客户端能支持服务端的低版本,就使用服务端的协议号,否则使用自己的协议版本号。
    客户端回复服务端一个报文,包含了客户端决定使用的协议版本号。
    服务端比较客户端发过来的版本号,决定是否能同客户端交互。
    如果协商成功,就进入密钥和算法协商阶段。否则服务端断开TCP连接。

2、密钥和算法协商阶段

    服务端和客户端分别发送算法协商报文给对方,报文中包含自己支持的公钥算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等。
    服务端和客户端根据对方和自己支持的算法得出最终使用的算法。
    服务端和客户端利用DH交换算法、主机密钥对等参数,生成会话密钥和会话ID。
        c公 客户端公钥
        c密 客户端密钥
        s公 服务端公钥
        s密 服务端密钥
在版本号协商阶段完成后:
    服务端将 s公 发送给客户端。
    服务端生成会话ID ,设为 id ,发送给客户端。
    客户端生成会话密钥,设为 key ,并计算 res = id 异或 key。
    客户端将 res 用 s公 进行加密,将结果发送给服务端。
    服务端用 s密 进行解密,得到 res。
    服务器计算 res 异或 id,得到 key。
    至此服务端和客户端都知道了会话密钥和会话ID,以后的数据传输都使用会话密钥进行加密和解密。

3、认证阶段

基于账号和口令的验证方式:
    客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、口令,将结果发送给服务器。
    服务端使用获得的会话密钥解密报文,得到账号和口令。
    服务端对这个账号和口令进行判断,如果失败,向客户端发送认证失败报文,其中包含了可以再次认证的方法列表。
    客户端从认证方法列表中选择一种方法进行再次认证。
    这个过程反复进行,直到认证成功或者认证次数达到上限,服务端关闭本次TCP连接。
基于公钥和私钥的验证方式:
    使用ssh-keygen程序生成公钥 id_dsa.pub 和私钥 id_dsa,一般是在客户端上生成,然后把 id_dsa.pub 通过某种方式发送给服务端。
    服务端放在将要远程登录过来的那个账号的目录的.ssh目录下面。
    客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、id_dsa.pub,将结果发送给服务端。
    服务端使用会话密钥解密报文,得到账号、id_dsa.pub。    服务端在这个账号的目录的.ssh目录下找对应的公钥,如果没有找到,发送失败消息给客户端,如果找到,比较客户发送过来的这个公钥和找到的公钥,如果内容相同,服务端生成一个随机的字符串,简称“质询”,然后使用找到的公钥加密这个质询,然后使用会话密钥再次加密。
    服务端把这个双重加密的数据发送给客户端。
    客户端使用会话密钥解密报文,然后使用id_dsa再次解密数据,得到质询。
    客户端使用会话密钥加密质询,发送给服务端。
    服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询,如果不相同,发送失败消息给客户端,如果相同,认证通过。

参考:

————- end ————-
From: GS
——————————-
分类: Linux入门大全 标签:

linux ln 命令使用参数详解(ln -s 软链接)

2016年5月12日 评论已被关闭

linux ln 命令使用参数详解(ln -s 软链接)

http://www.jb51.net/LINUXjishu/150570.html
这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件
这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。
当 我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

例如:ln -s /bin/less /usr/local/bin/less

-s 是代号(symbolic)的意思。
这 里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。

ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
1.命令格式:
ln [参数][源文件或目录][目标文件或目录]
2.命令功能:
Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
软链接:
1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2.软链接可以 跨文件系统 ,硬链接不可以
3.软链接可以对一个不存在的文件名进行链接
4.软链接可以对目录进行链接
硬链接:
1.硬链接,以文件副本的形式存在。但不占用实际空间。
2.不允许给目录创建硬链接
3.硬链接只有在同一个文件系统中才能创建
这里有两点要注意:
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
第二,ln的链接又分软链接和硬链接两种,软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
ln指令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。

3.命令参数:
必要参数:
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程

选择参数:
-S “-S<字尾备份字符串> ”或 “–suffix=<字尾备份字符串>”
-V “-V<备份方式>”或“–version-control=<备份方式>”
–help 显示帮助信息
–version 显示版本信息

4.使用实例:
实例1:给文件创建软链接
命令:
ln -s log2013.log link2013
输出:

复制代码代码如下:

[root@localhost test]# ll
-rw-r–r– 1 root bin 61 11-13 06:03 log2013.log
[root@localhost test]# ln -s log2013.log link2013
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 log2013.log
说明:
为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效

实例2:给文件创建硬链接
命令:
ln log2013.log ln2013
输出:

复制代码代码如下:

[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 log2013.log
[root@localhost test]# ln log2013.log ln2013
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 2 root bin 61 11-13 06:03 ln2013
-rw-r–r– 2 root bin 61 11-13 06:03 log2013.log
说明:
为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同
实例3:接上面两实例,链接完毕后,删除和重建链接原文件
命令:
输出:

复制代码代码如下:

[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 2 root bin 61 11-13 06:03 ln2013
-rw-r–r– 2 root bin 61 11-13 06:03 log2013.log
[root@localhost test]# rm -rf log2013.log
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 ln2013
[root@localhost test]# touch log2013.log
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 ln2013
—xrw-r– 1 root bin 302108 11-13 06:03 log2012.log
-rw-r–r– 1 root root 0 12-07 16:19 log2013.log
[root@localhost test]# vi log2013.log
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10
2013-11
2013-12[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 ln2013
-rw-r–r– 1 root root 96 12-07 16:21 log2013.log
[root@localhost test]# cat link2013
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10
2013-11
2013-12
[root@localhost test]# cat ln2013
hostnamebaidu=baidu.com
hostnamesina=sina.com
hostnames=true
说明:
1.源文件被删除后,并没有影响硬链接文件;软链接文件在centos系统下不断的闪烁,提示源文件已经不存在
2.重建源文件后,软链接不在闪烁提示,说明已经链接成功,找到了链接文件系统;重建后,硬链接文件并没有受到源文件影响,硬链接文件的内容还是保留了删除前源文件的内容,说明硬链接已经失效

实例4:将文件链接为另一个目录中的相同名字
命令:
ln log2013.log test3
输出:

复制代码代码如下:

[root@localhost test]# ln log2013.log test3
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 ln2013
-rw-r–r– 2 root root 96 12-07 16:21 log2013.log
[root@localhost test]# cd test3
[root@localhost test3]# ll
-rw-r–r– 2 root root 96 12-07 16:21 log2013.log
[root@localhost test3]# vi log2013.log
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10[root@localhost test3]# ll
-rw-r–r– 2 root root 80 12-07 16:36 log2013.log
[root@localhost test3]# cd ..
[root@localhost test]# ll
lrwxrwxrwx 1 root root 11 12-07 16:01 link2013 -> log2013.log
-rw-r–r– 1 root bin 61 11-13 06:03 ln2013
-rw-r–r– 2 root root 80 12-07 16:36 log2013.log
[root@localhost test]#
说明:
在test3目录中创建了log2013.log的硬链接,修改test3目录中的log2013.log文件,同时也会同步到源文件
实例5:给目录创建软链接
命令:
ln -sv /opt/soft/test/test3 /opt/soft/test/test5
输出:

复制代码代码如下:

[root@localhost test]# ll
drwxr-xr-x 2 root root 4096 12-07 16:36 test3
drwxr-xr-x 2 root root 4096 12-07 16:57 test5
[root@localhost test]# cd test5
[root@localhost test5]# ll
lrwxrwxrwx 1 root root 5 12-07 16:57 test3 -> test3
[root@localhost test5]# cd test3
-bash: cd: test3: 符号连接的层数过多
[root@localhost test5]#
[root@localhost test5]#
[root@localhost test5]# ll
lrwxrwxrwx 1 root root 5 12-07 16:57 test3 -> test3
[root@localhost test5]# rm -rf test3
[root@localhost test5]# ll
[root@localhost test5]# ln -sv /opt/soft/test/test3 /opt/soft/test/test5
创建指向“/opt/soft/test/test3”的符号链接“/opt/soft/test/test5/test3”
[root@localhost test5]# ll
lrwxrwxrwx 1 root root 20 12-07 16:59 test3 -> /opt/soft/test/test3
[root@localhost test5]#
[root@localhost test5]# cd test3
[root@localhost test3]# ll
总计 4
-rw-r–r– 2 root root 80 12-07 16:36 log2013.log
[root@localhost test3]# touch log2014.log
[root@localhost test3]# ll
总计 4
-rw-r–r– 2 root root 80 12-07 16:36 log2013.log
-rw-r–r– 1 root root 0 12-07 17:05 log2014.log
[root@localhost test3]# cd ..
[root@localhost test5]# cd ..
说明:
1.目录只能创建软链接
2.目录创建链接必须用绝对路径,相对路径创建会不成功,会提示:符号连接的层数过多 这样的错误
3.在链接目标目录中修改文件都会在源文件目录中同步变化

链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。
ln 命令
用途
链接文件。
语法
将某个文件链接到一个文件上
ln [ -f | -n] [ -s ] SourceFile [ TargetFile ]
将一个或多个文件链接到一个目录上
ln [ -f | -n] [ -s ] SourceFile … TargetDirectory
描述
ln 命令将在 SourceFile 参数中指定的文件链接到在 TargetFile 参数中指定的文件,或将其链接到在 TargetDirectory 参数中指定的另一个目录中的文件。在缺省情况下,ln 命令会创建硬链接。如果需要使用 ln 命令来创建符号链接,请指明 -s 标志。
符号链接是指向文件的一个间接指针;它的目录项中包含了它所链接的文件名。符号链接可能会跨越文件系统,可能指向目录。
如果正在将某个文件链接到新的名字,那么只能列出一个文件。如果链接到一个目录,那么可以列出多个文件。
TargetFile 参数是可选的。如果不指定目标文件,ln 命令会在当前的目录中创建一个新的文件。新的文件继承了指定在 SourceFile 参数中的文件名。请参阅示例 5。
注意:
如果不使用 -s 标志,就不能在文件系统之间链接文件。
如果 TargetDirectory 已经是链接到目录上的一个符号链接,那么 ln 命令将现有的目标视为文件。这意味着,类似于 ln -fs somepath/lname symdir 的命令不会遵循现有的 symdir 符号链接,作为代替,它会创建一个从 somepath/lname 到 symdir 的新的符号链接。
标志
-f 促使 ln 命令替换掉任何已经存在的目的路径。如果目的路径已经存在,而没有指定 -f 标志,ln 命令不会创建新的链接,而是向标准错误写一条诊断消息并继续链接剩下的 SourceFiles。
-n 指定,如果链接是一个现有的文件,那么不要覆盖文件的内容。 -f 标志重设了这个标志。这是缺省的行为。
-s 促使 ln 命令创建符号链接。符号链接中包含了它所链接的文件的名字。当对链接执行打开操作的时候,会使用到引用文件。对符号链接的 stat 调用会返回链接的目标文件;必须完成lstat 调用来获取链接的信息。可以使用 readlink 调用来读取符号链接的内容。符号链接可能跨越文件系统,指向目录。
注意:当为 -s 标志指定 SourceFile 参数的时候,必须使用绝对路径。如果没有指明绝对路径,那么当 SourceFile 和 TargetFile 参数位于不同的目录中的时候,可能会发生意外的结果。在创建符号链接之前,不需要存在源文件。
退出状态
此命令返回以下的退出值:
0 所有指定的文件都成功链接上了。
>0 出现一次错误。
示例
零、为了创建到一个文件的另一个链接(别名),请输入:
ln -f chap1 intro
这会将 chap1 链接到新的名称, intro。如果 intro 不存在,那么会创建该文件名。如果 intro 已经存在了,那么这个文件会被替换为指向 chap1的一个链接。然后 chap1 和 intro 文件名会指向同一个文件。对其中任何一个的更改都会出现在另一个中。如果一个文件名被 rm 命令删除,那么该文件并没有完全被删除,因为它仍然以其它的名字存在。
一、为了将文件链接为另一个目录中的相同名字,请输入:
ln index manual
这会将 index 链接到新的名称,manual/index。
注意:在示例 1 中的 intro 是一个文件的名称;在示例 2 中的 manual 是一个已经存在的目录。
二、为了将几个文件链接为另一个目录中的名称,请输入:
ln chap2 jim/chap3 /home/manual
这会将 chap2 链接到新的名称 /home/manual/chap2;将 jim/chap3 链接到新的名称 /home/manual/chap3。
三、如果想要在 ln 命令中使用模式匹配字符,请输入:
n manual/* .
这会将 manual 目录中的所有文件链接到当前目录中, . (点),给他们在 manual 目录中同样的名称。
注意: 必须在星号和句点之间输入一个空格。
四、为了创建一个符号链接,输入:
ln -s /tmp/toc toc
这会在当前的目录中创建符号链接 toc。 toc 文件指向 /tmp/toc 文件。如果 /tmp/toc 文件已经存在了,那么 cat toc 命令可以列出其内容。
五、如果想要在不指明 TargetFile 参数的情况下得到相同的结果,请输入:
ln -s /tmp/toc

Linux/Centos批量文件重命名

2016年5月12日 评论已被关闭

Linux/Centos批量文件重命名

http://www.5yun.org/8962.html
linux本身是不支持空格的,如果文件名含有空格就会处理失败,所以需要将文件名的空格给批量处理一下才能正常使用rename命令

将当前目录下文件依次按照1.flv 2.flv 3.flv以此类推重命名

批量将文件名后缀由flv改为mp4

将文件名开头部分AAA批量替换成BBB

批量删除文件名当中指定文字(第八行是执行命令)

批量在所有文件名开头添加AAA

批量修改文件名前五个字符为ABCDE

批量修改文件名后五个字母为54321

在所有文件名开头添加www.5yun.org

文件名字母小写改成大写

Nginx如何启用ETag,提高访问速度

2016年5月4日 评论已被关闭

Nginx如何启用ETag,提高访问速度

http://www.t086.com/article/5207

ETag全称EntityTags,HTTP协议规格说明中定义“ETag”为“被请求变量的实体值”。我们也可以把ETag理解为是一个客户端与 服务器关联的记号。这个记号告诉客户端,当前网页在上次请求之后是否有发生变化,当发生变化时,ETag的值重新计算,并返回200状态码。如果没有变 化,返回304状态码。从而不会重新加载整个页面信息。

以下会告诉你,Nginx如何开启ETag。

步骤1
确认Nginx版本,命令:Nginx安装目录/sbin/nginx–v,

 

版本为1.7.3及更高,继续步骤2;版本为1.7.3以下,1.3.3及以上,进行步骤3;版本为1.3.3以下,不支持ETag,请升级您的Nginx。

步骤2
确认没有关闭ETag:打开Nginx的配置文件nginx.conf(默认位置Nginx安装目录/conf/),确保其中没有出现etagoff;,下图为出现的情况,请将此行删除。

 

确认没有使用ngx_headers_more清除ETag头:同样在配置文件中不能出现如下语句的任意一句,如果出现请将其删除。
重新启动Nginx,就启用ETag功能了。

步骤3

查看是否开启了gzip,且是否和etag出现冲突,出现冲突去步骤4,没有去步骤2。
打开Nginx的配置文件nginx.conf(默认位置Nginx安装目录/conf/),其中出现gzip on;语句证明开启了gzip,如图

 

开启gzip时,可能与etag出现冲突,用浏览器多次请求此网站的静态元素,如果只返回200,不返回304,证明存在冲突,请去步骤4;没有冲突去步骤2。

步骤4
请关闭gzip,即将上一步中的gzipon;改为gzip off;然后去步骤2。

若不想关闭gzip,并要开启ETag,同时仍要坚持使用当前的Nginx版本,只能修改源码并重新编译。
下载此版本安装包并解压,将其目录下/src/http/modules/ngx_http_gzip_filter_module.c
文件中约309行左右的ngx_http_clear_etag(r);一行注释掉或删掉。如下图

如果没有找到ngx_http_clear_etag(r);而是发现ngx_http_weak_etag(r);如下图,证明此Nginx

没有gzip和etag冲突的问题,不必进行任何修改。
重新编译源码安装Nginx,解决这个冲突,然后去步骤2。

 

分类: Linux入门大全 标签:

选择ImageMagick还是GraphicsMagick(翻译)

2015年9月19日 评论已被关闭

选择ImageMagick还是GraphicsMagick(翻译)

http://co63oc.blog.51cto.com/904636/328997

 

ImageMagick or GraphicsMagick?
Nathan Willis 七月三日,2007年

ImageMagick(IM) 套装包含的命令行图形工具是一主要自由软件;Linux,其他类Unix操作系统,专有的操作系统像Windows支持IM差不多两个十年。但还是存在一个选择,称为GraphicsMagick(GM),覆盖了大多数一样的功能。那你怎么知道哪一个是适合你的?

虽然IM把它的历史回到1987年,当它是一个内部的工具的时候,在 DuPont被开发,第一次公共的源代码发布是1990年。核心包是一系列分离的命令行的集合:animate,compare,display,identify,mogrify等等。

因为它的命令行接口暴露了这么些功能,IM有一段长时间被用在脚本,自动化处理。它处理服务器端图片操作,在web应用程序,像个人图片库,wikipedia一样变化。随着时间过去,接口支持许多流行的语言,把IM开放给程序员,像一个系统库。

从这些了解,问题开始了。IM并不是一个库—它是一套不连续的命令行执行程序。但是越来越多的编程者开始使用IM通过它的语言接口,库的概念逐渐进入。库需要考虑事情,比如应用程序二进制接口(ABI),它的稳定性–但是交互的命令不需要。

多个核心IM开发者,对ABI的稳定性问题更感兴趣,产生的结果是有一个IM的分支,开始一个新的项目,提高优先级,在ABI方面和长期的稳定性上,相对增加新的特征而言。这个项目变为 GraphicsMagick,在2003年4月从 ImageMagick分离出来。

确实如它所说,GM增加了较少的特征,从它最初开始,相比IM同样的时间线上。GM提供了同样的重要的工具,在IM中的–IM只是在这些年增加了更多选项。

为了不覆盖IM提供的命令,GM封装所有的命令为一个:gm。同样的IM的名字作为它的第一个参数。例如,在IM用 convert photograph.jpg photograph.tiff,在GM中用 gm convert photograph.jpg photograph.tiff。

选择,选择…

这个决定在GM小组中意味GM和IM能友好地在一个系统中共存。所以你要使用哪一个?明智的做法是你使用IM处理交互任务,使用GM在脚本或服务器端安装。事实上,许多第三方应用和框架习惯只依赖IM的现在也支持GM—例子包含Gallery,Exhibit Engine,TYPO3,和RMagick。

但是实际上你并不喜欢体验ImageMagick的稳定性问题,在脚本或Web应用中。这些抱怨升级,在IM-GM产生的争论中,IM改变它的语法在成功发布的版本中。但是你要多经常去更新IM程序,在一个服务器上?ABI改变对你有些影响这还不够,特别地,当你考虑到90%的IM使用是限制在呆板的操作,像改变大小和比例。

在另一方面,如果你考虑你可能需要一个命令行工具操作图形,在X图形PC上,通常因为工具是一个选择,而GUI的图形编辑器并不支持,或者作为批处理节省时间的因素,在非常大的文件(特别高位深图片)。我常常发送数字图片给专业图片打印机,它需要特别设置颜色空间和嵌入的配置,在一些情况下,Linux下用IM转换文件给机器是唯一的选择。像GIMP,Krita,CinePaint支持的新的特征和格式经常是首先发送给IM。
如果你正在开发一个应用或工具,花一些时间去熟悉语言绑定,对于IM和GM;合适的绑定可能在其中一个,这样选择就明显了。除非你绝对不怀疑需要一些新的IM选项,而GM中无效,安全的投注是针对GM的特征集,并让你的应用可以和任何一个一起工作。

在过去一些年,GM的开发分支开始增加一些新的特征,IM的新的贡献者的注意力集中在稳定套件的语法,所以包之间的区别是狭小的。站在一个社区点的位置,是不想看到一个不友善的项目产生,即使是技术的原因。我并不建议某一天IM和GM项目合并,但是希望美好地看到他们能像植物交叉授粉,继续互相学习。

如何让alias永久生效?

2015年9月19日 评论已被关闭

如何让alias永久生效?
http://blog.csdn.net/jiajianjunneusoft/article/details/6901625
alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入。如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且也能提高效率,真是一举两得的好事。
基本用法: alias 的基本使用方法为:alias 新的命令=’原命令 -选项/参数’。举例说明,alias l=‘ls -lsh’ 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
获知别名: 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。
删除别名: 要删除一个别名,可以使用 unalias 命令,如 unalias l。
上面的是网上看到的,这个方法只是暂时的,如果重启一次就失效了,如果我们想永久生效一个命令怎么办呢?
打开 .bashrc (应该是ubuntu发行版的,其他发行版也许可以修改.bash_profile)可以看到
……
# some more ls aliases
alias ll=’ls -alF’
alias la=’ls -A’
alias l=’ls -CF’
……
方法1 :直接在我们的 环境变量文件中添加 alias xx=’xxxxx’
方法2 : .bashrc 中有一句话
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
就是说可以另外新建一个文件用于专门存放自己的alias信息

$ cd
$ vi .bash_aliases
在文件中输入自己想设置的命令 alias rm=’rm -i’ 然后保存推出
$ source .bashrc #让我们的环境生效
方法……
小结:
1.很多时候我们只注意了解决问题本身,但是往往忽略了其他的东西,在解决问题的过程中也是一个学习的机会,尤其不要忘了看软件源码之类的注释!突然发现这个非常重要,就是因为看了注释,我才发现了这个方法,而我本来的目的是想对我自己的环境变量进行设置修改,在解决环境变量的问题同时我又顺带解决了这个 alias的问题,以后得牢记!!!
2.在查找网上的解决方法的时候,经常发现别人有的文件本机没有,例如.bashrc 和 .bash_profile 可能就是不同发行版上的,这个时候可以换个搜索方式,或者自己尝试……
ubuntushelllinuxfile
alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入。如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且也能提高效率,真是一举两得的好事。
基本用法: alias 的基本使用方法为:alias 新的命令=’原命令 -选项/参数’。举例说明,alias l=‘ls -lsh’ 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
获知别名: 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。
删除别名: 要删除一个别名,可以使用 unalias 命令,如 unalias l。
上面的是网上看到的,这个方法只是暂时的,如果重启一次就失效了,如果我们想永久生效一个命令怎么办呢?
打开 .bashrc (应该是ubuntu发行版的,其他发行版也许可以修改.bash_profile)可以看到
……
# some more ls aliases
alias ll=’ls -alF’
alias la=’ls -A’
alias l=’ls -CF’
……
方法1 :直接在我们的 环境变量文件中添加 alias xx=’xxxxx’
方法2 : .bashrc 中有一句话
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
就是说可以另外新建一个文件用于专门存放自己的alias信息

$ cd
$ vi .bash_aliases
在文件中输入自己想设置的命令 alias rm=’rm -i’ 然后保存推出
$ source .bashrc #让我们的环境生效
方法……
小结:
1.很多时候我们只注意了解决问题本身,但是往往忽略了其他的东西,在解决问题的过程中也是一个学习的机会,尤其不要忘了看软件源码之类的注释!突然发现这个非常重要,就是因为看了注释,我才发现了这个方法,而我本来的目的是想对我自己的环境变量进行设置修改,在解决环境变量的问题同时我又顺带解决了这个 alias的问题,以后得牢记!!!
2.在查找网上的解决方法的时候,经常发现别人有的文件本机没有,例如.bashrc 和 .bash_profile 可能就是不同发行版上的,这个时候可以换个搜索方式,或者自己尝试……

分类: Linux入门大全 标签:

linux中设置alias永久生效

2015年9月19日 评论已被关闭

linux中设置alias永久生效
http://jishu.zol.com.cn/2747.html
alias 设置别名
语法为:
例如 alias log=’cd /apache-tomcat/logs’
这样执行log就可以快速切换到存放tomcat日志的目录
因此,别名可以减少很多的输入,提高工作效率
但是当关闭终端后别名都会失效,
那是因为没有将它写死到文件中
下面就开始改写文件
我的系统是ubuntu 12.04,在home目录下有一个隐藏文件 : .bashrc
打开该文件
javaranger@ubuntu:~$ ls -a 可以查看到
打开该文件
javaranger@ubuntu:~$ sudo gedit ./.bashrc
文档偏后部分有如下
# some more ls aliases
alias ll=’ls -alF’
alias la=’ls -A’
alias l=’ls -CF’
alias tomcat=’cd ~/tomcat/bin’
alias log=’cd /apache-tomcat/logs’
其中最后一个log是我新添加的,所以你们有什么自己定义的alias可以写在这里
改写完成保存退出
执行 source ~/.bashrc
javaranger@ubuntu:~$ source ~/.bashrc
你的alias 别名就永久生效了

分类: Linux入门大全 标签:

Linux内核编译常见问题及解决方法

2015年9月17日 评论已被关闭

Linux内核编译常见问题及解决方法
http://emb.sunplusedu.com/answer/2013/0618/1741.html
1、若编译内核时总是出现同一个错误,如下:
在make modules_install时最后几行弹出错误:
if [ -r System.map -a -x /sbin/depmod ]; then /sbin/depmod -ae -F System.map 2.6.12.2; fi
/bin/sh: line 1: 3357 已杀死 /sbin/depmod -ae -F System.map 2.6 .12.2
make: *** [_modinst_post] 错误 137
如果继续make install,重启,是进不去刚刚编译安装的那个内核的,显示内核错误。
分析:如果 System.map可读 并且 /sbin/depmod可执行;那么就执行/sbin/depmod -ae -F System.map 2.6.20;结束
depmod(depend module)
功能说明:分析可载入模块的相依性。
语 法:depmod [-adeisvV][-m <文件>][–help][模块名称]
补充说明:depmod可检测模块的相依性,供modprobe在安装模块时使用。
参 数:
-a或–all 分析所有可用的模块。
-d或debug 执行排错模式。
-e 输出无法参照的符号。
-i 不检查符号表的版本。
-m<文件>或system-map<文件> 使用指定的符号表文件。
-s或–system-log 在系统记录中记录错误。
-v或–verbose 执行时显示详细的信息。
-V或–version 显示版本信息。
–help 显示帮助。
解决方法:make module_install之前你是否关闭了selinux,
该问题是selinux阻止写/lib/modules/ <version> 目录
2、若重启系统后显示:
Warning–SElinux relabel is required
Disabling security enforcement
Relabeling could take a very long time
depending on file system size
可以更改grub.conf 将selinux=0添加到如下位置
kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ selinux=0 rhgb quiet
或者更改/etc/selinux/config,将SELINUX=Disabled,存盘就可以把 selinux 关闭了
3、修改selinux
在新版本中的Red Hat 和 Fedora 上,修改档案/etc/sysconfig/selinux:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted – Only targeted network daemons are protected.
# strict – Full SELinux protection.
SELINUXTYPE=targeted
把 SELINUX设定为disable, 下次启动系统后将会停止SElinux.
Linux核心参数(Kernel Parameter)
或者可以在核心参数后加上: selinux=0 (停止) 或 selinux=1 (开启)参数
档案/boot/grub/menu.lst
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet selinux=0
initrd /initrd-2.6.18-1.2798.fc6.img
检查SELinux现时况态
要知到你现在是否使用 SELinux:
# getenforce
disabled
4、重启后若出现Kernel panic:VFS: Unable to mount root fs on unknown-block(0,0)
从错误信息上看,是没有识别到硬盘。看来,我机器上的SATA硬盘必须在内核中做相应的配置才能识别。
仔细阅读了内核配置时的帮助信息,得知内核支持两种SATA驱动程序:一种是libata,在SCSI子系统中,支持最新的SATA控制器;还有一种是 IDE驱动程序中的SATA,主要是支持第一代的SATA控制器。我的机器应该是比较新的,所以先按libata的方式来配置试试。
先看看我的SATA控制器是什么类型的?运行lspci,输出如下:
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Con troller (rev 01)
就是SATA控制器的类型。
解决方法:在make menuconfig中设置以下选项:
Device Driver
|—->SCSI device support
|—->SCSI disk support
|—–>verbose SCSI error reporting (不是必须的,但可方便问题定位)
|—–>SCSI low-level drivers
|—->Serial ATA (SATA) support
|—->intel PIIX/ICH SATA support
<*> RAM disk support 在 device drivers -> Block devices中
<*> Initial RAM disk (initrd) support 在 device drivers -> Block devices中
<*> Compressed ROM file system support (cramfs) 在file systems -> Miscellaneous filesystems中
5、若重启之后出现网卡不识别,无法激活,出现via-rhine device eth0 does not seem to be present, delaying initialization
缺少VIA 驱动
运行 make menuconfig
在Networking support–>Networking device support –> Ethernet (10 or 100Mbit) 里找到 <M>”VIA Rhine RevB support”
6、若重启后显示如下:
reading all physical volumns, this may take a while…
no volumns group found!
unable to find volumns group “VolGroup00″
ERROR: /bin/lvm exited abnormal with value 5 (pid 335)
error 6 mounting ext3
ERROR OPENING /dev/console!!:2
error dup2ing fd of 0 to 0
error dup2ing fd of 1 to 1
error duping fd of 2 to 2
switchroot:mount failed:22
kernel panic – no syncing: attempted to kill init!
运行make menuconfig时在 device drivers ->[*] Multiple devices driver support (RAID and LVM)
如果有以下选项,也应该启用它们:<*> Logical volume manager (LVM) support

�|$rbn ��; font-family: 宋体; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);”> 这是在设备驱动初始化时向中断子系统注册的
*/
desc->handle_irq(irq, desc);
}
return true;
}
由上面的注释知,我们直接看handle_IRQ_event函数
[cpp] view plaincopyprint?irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
{
irqreturn_t ret, retval = IRQ_NONE;
unsigned int status = 0;
/*为CPU会禁止中断,这里将其打开,如果没有指定
IRQF_DISABLED标志的话,它表示处理程序在中断禁止
情况下运行*/
if (!(action->flags & IRQF_DISABLED))
local_irq_enable_in_hardirq();
do {/*遍历当前irq的action链表中的所有action,调用之*/
trace_irq_handler_entry(irq, action);/*打开中断跟踪*/
ret = action->handler(irq, action->dev_id);/*调用中断函数*/
trace_irq_handler_exit(irq, action, ret);/*关闭中断跟踪*/
switch (ret) {
case IRQ_WAKE_THREAD:
/*
* Set result to handled so the spurious check
* does not trigger.
*/
ret = IRQ_HANDLED;
/*
* Catch drivers which return WAKE_THREAD but
* did not set up a thread function
*/
if (unlikely(!action->thread_fn)) {
warn_no_thread(irq, action);
break;
}
/*
* Wake up the handler thread for this
* action. In case the thread crashed and was
* killed we just pretend that we handled the
* interrupt. The hardirq handler above has
* disabled the device interrupt, so no irq
* storm is lurking.
*/
if (likely(!test_bit(IRQTF_DIED,
&action->thread_flags))) {
set_bit(IRQTF_RUNTHREAD, &action->thread_flags);
wake_up_process(action->thread);
}
/* Fall through to add to randomness */
case IRQ_HANDLED:
status |= action->flags;
break;
default:
break;
}
retval |= ret;
action = action->next;/*取得下一个action,如果有的话*/
} while (action);
/*如果指定了标志,则使用中断间隔时间为随机数产生器产生熵*/
if (status & IRQF_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
/*关闭中断,do_IRQ进入下一轮循环——等待新的中断到来*/
local_irq_disable();
return retval;
}
可知,在handle_event_IRQ函数中完成了具体的中断函数响应执行工作。也在这里我们看出,多个中断服务函数共享同一个中断号时,在每次中断到来时,在中断向量上的服务函数队列中所有的服务函数将执行一遍。而对于中断线程也会在这里得到执行。
到这里中断的初始化、中断服务的相应的分析完了,对于中断返回的退出,基本和异常的返回是一样的,我们从代码中可以看出
[cpp] view plaincopyprint?ret_from_exception:
preempt_stop(CLBR_ANY)
ret_from_intr:
GET_THREAD_INFO(%ebp)

至此,中断和异常的分析基本上就这样了,中间有很多细节是值得去理解的。包括汇编和c的实现技巧。对于软中断和任务队列将在后面给予介绍。

分类: Linux入门大全 标签:

linux-2.6内核升级详细文档

2015年9月17日 评论已被关闭

linux-2.6内核升级详细文档
http://www.jb51.net/os/RedHat/1229.html
序 做一件事情,首先要知道自己在干什么,而不是盲目得升级内核,现在升级内核有点泛滥,sig 首先让我们先了解一下2.6内核的新特性 一、01.模块子系统(Module Subsystem)、

做一件事情,首先要知道自己在干什么,而不是盲目得升级内核,现在升级内核有点泛滥,sigh
首先让我们先了解一下2.6内核的新特性

一、01.模块子系统(Module Subsystem)、统一设备模型(Unified Device Model)和 PnP 支持
模块子系统发生了重大变化。

02.稳定性有所提高
为了彻底避免内核加载或者导出正在被使用的内核模块,或者至少为了减少加载或者卸载模块的同时使用该模块的可能性
(这有时会导致系统崩溃),内核加载和导出内核模块的过程都得到了改进。

03.统一设备模型
统一设备模型的创建是 2.6 内核最重要的变化之一。它促进了模块接口的标准化,其目的是更好地控制和管理设备,例如:

更准确地确定系统设备。
电源管理和设备电源状态。
改进的系统总线结构管理。

04.即插即用(PnP)支持
1.1.1 和 1.1.2 小节中提及的变化使得运行 2.6 内核的 Linux 成为一个真正即插即用的 OS。
例如,对 ISA PnP 扩展、遗留 MCA 和 EISA 总线以及热插拔设备的 PnP 支持。

05.内核基础设施的变化
为了区别以 .o 为扩展名的常规对象文件,内核模块现在使用的扩展名是 .ko。
创建了新的 sysfs 文件系统,当内核发现设备树时就会描述它。
内存支持,NUMA 支持
支持更大数量的 RAM
2.6 内核支持更大数量的 RAM,在分页模式下最高可达 64GB。

06.NUMA
对非一致内核访问(Non-Uniform Memory Access – NUMA)系统的支持是 2.6 内核中新出现的。

07.线程模型,NPTL
相对于 v2.4 的 LinuxThreads,在版本 2.6 中新出现的是 NPTL(Native POSIX Threading Library)。
NPTL 为 Linux 带来了企业级线程支持,提供的性能远远超过了 LinuxThreads。它所基于的用户与内核线程的比率是 1:1。

在 2003 年 10 月,GNU C 程序库 glibc 中融入了 NPTL 支持,Red Hat 率先在 Red Hat Linux 9 和
Red Hat Enterprise Linux 中使用定制的 v2.4 内核实现了 NPTL。

08.性能改进
新的调度器算法
2.6 Linux 内核引入了新的 O(1) 算法。在高负载情况下它运行得特别好。新的调度器基于每个 CPU 来分布时间片,
这样就消除了全局同步和重新分配循环,从而提高了性能。

内核抢占(Kernel Preemption)
新的 2.6 内核是抢占式的。这将显著地提高交互式和多媒体应用程序的性能。

I/O 性能改进
Linux 的 I/O 子系统也发生了重大的变化,通过修改 I/O 调度器来确保不会有进程驻留在队列中过长时间等待进行输入/输出操作,
这样就使得 I/O 操作的响应更为迅速。

快速用户空间互斥(Fast User-Space Mutexes)
“futexes”(快速用户空间互斥)可以使线程串行化以避免竞态条件,引入它也提高了响应速度。
通过在内核空间中部分实现“futexes”以允许基于竞争设置等待任务的优先级而实现改进。

09.扩展性改进
处理器数目更多
Linux 内核 2.6 最多可以支持 64 个 CPU。支持更大的内存,归功于 PAE(物理地址扩展,Physical Address Extensions),在 32-位系统上分页模式下所支持的内存增加到了 64GB。

用户和组
惟一用户和组的数量从 65,000 增至 40 多亿,也就是从 16-位增加到了 32-位。

PID 的数量
PID 的最大数量从 32,000 增至 10 亿。

打开文件描述符的数量
打开文件描述符的数量没有增加,但是不再需要事先设置该参数,它将自行调节。

10.支持更多的设备
在 Linux 内核 2.6 之前,内核中有可以约束大型系统的限制,比如每条链 256 个设备。v2.6 内核彻底地打破了这些限制,
不但可以支持更多类型的设备,而且支持更多同类型的设备。在 Linux 2.6 系统中,可以支持 4095 种主要的设备类型,
每一个单独的类型可以有超过一百万个子设备。
文件系统大小
Linux 内核 2.6 所允许的可寻址文件系统大小最大为 16 TB。

11.文件系统
ext2、ext3 和 ReiserFS 等传统 Linux 文件系统得到了显著的改进。最值得注意的改进是扩展属性(或文件元数据)的引入。
最重要的是 POSIX ACL 的实现,这是对普通 UNIX 权限的扩展,可以支持更细化的用户访问控制。

12.除了对传统 Linux 文件系统的改进支持以外,新的内核完全支持在 Linux 中相对较新的 XFS 文件系统。
Linux 2.6 内核现在还引入了对 NTFS 文件系统的改进的支持,现在允许以读/写模式安装 NTFS 文件系统。

基于以上2.6的新特性,我决定用2.6的内核,我的系统为Red Hat Enterprise Linux AS release 3 (Taroon Update 3)
硬件环境为DELL 2850

一、下载解压并打上内核补丁
我以2.6.10为例子,patche以bk4的例子,目的只是让大家知道怎么打patch,
其实本人用的是2.6.6的内核,因为在AS3.0上升级到2.6.9以上的内核,
mount大的nfs网络硬盘时,df 显示不正确,明明是800G的盘变成4.2G,
不过还是能正常用,我升级过nfs和mount的包都没用,/var/log/message里
提示是kernel: nfs warning: mount version older than kernel,
还望知道的 告知一声,谢 :) BTW:2.6.8的内核没用过

内核源代码:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.bz2
最新内核补丁:http://www.kernel.org/pub/linux/ … atch-2.6.10-bk4.bz2

cd /usr/src
rm -rf linux
tar jxf /download/linux-2.6.10.tar.bz2
ln -s linux-2.6.10 linux
cd linux
bunzip2 -dv /download/patch-2.6.10-bk4.bz2 |patch -p1
如果在/usr/src目录下就用patch -p0

二、修改内核源代码 (升级2.6就是为了优化,干脆连源代码也改了吧)

1.修改/usr/src/linux/include/linux/posix_types.h
设置fd_set支持的最大数量
#define __FD_SETSIZE 1024 —>; 65536

2.修改/usr/src/linux/include/linux/fs.h
设置最大打开文件数量(TCP连接数量)
#define INR_OPEN 1024 —>; 65536
#define NR_FILE 8192 —>; 65536
#define NR_RESERVED_FILES 10 —>; 128

3.修改/usr/src/linux/include/net/tcp.h
设置TIMEOUT的时间为1秒
#define TCP_TIMEWAIT_LEN (60*HZ) 60 —>; 1*HZ
设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上 也是减少重试时间
#define TCP_SYNACK_RETRIES 5 —>; 3

针对RHEL-AS3本来就是稳定+优化的,不过就算你用 RHEL-AS3 自己的内核,那也要修改一下上面的参数才好呀 :)

三、安装必要的工具

1.下载module-init-tools-3.1.tar.bz2
http://www.kernel.org/pub/linux/ … t-tools-3.1.tar.bz2

[Copy to clipboard] [ – ] CODE: ./configure –prefix=/
make moveold
make all install
./generate-modprobe.conf /etc/modprobe.conf
2.下载新的mkinitrd
ftp://195.220.108.108/linux/6/fe … d-4.1.18-2.i386.rpm
它需要lvm2 device-mapper
ftp://195.220.108.108/linux/6/fe … -1.00.19-2.i386.rpm
ftp://195.220.108.108/linux/6/fe … 00.25-1.01.i386.rpm
如果不更新这个包在make install时会提示以下错误:

[Copy to clipboard] [ – ] CODE: No module mptbase found for kernel 2.6.10-bk4, aborting.
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error 2
安装lvm2-2.00.25-1.01.i386.rpm时请用rpm -ivh –nodeps package name

四、make menuconfig

[Copy to clipboard] [ – ] CODE: 01.Code maturity level options —>;
[*] Prompt for development and/or incomplete code/drivers
[*] Select only drivers expected to compile cleanly
02.General setup —>;
[*] Support for paging of anonymous memory (swap)
[*] System V IPC
[*] POSIX Message Queues
[ ] BSD Process Accounting
[*] Sysctl support
[ ] Auditing support
[ ] Support for hot-pluggable devices
[*] Kernel Userspace Events
[ ] Kernel .config support
[*] Configure standard kernel features (for small systems) —>;
[*] Load all symbols for debugging/kksymoops
[ ] Do an extra kallsyms pass
[*] Enable futex support
[*] Enable eventpoll support
[ ] Optimize for size
[*] Use full shmem filesystem
03.Loadable module support —>;
[*] Enable loadable module support
[*] Module unloading
[ ] Forced module unloading
[ ] Module versioning support (EXPERIMENTAL)
[ ] Source checksum for all modules
[*] Automatic kernel module loading
04.Processor type and features —>;
Subarchitecture Type (PC-compatible) —>;
Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) —>;
[*] Generic x86 support
[ ] HPET Timer Support
[*] Symmetric multi-processing support 多CPU
(8) Maximum number of CPUs (2-255)
[*] SMT (Hyperthreading) scheduler support
[*] Preemptible Kernel 抢占式内核,请选上它
[ ] Machine Check Exception
< >; Toshiba Laptop support
< >; Dell laptop support
< >; /dev/cpu/microcode – Intel IA32 CPU microcode support
< >; /dev/cpu/*/msr – Model-specific register support
< >; /dev/cpu/*/cpuid – CPU information support
Firmware Drivers —>;
High Memory Support (4GB) —>; 高内存
[ ] Allocate 3rd-level pagetables from highmem
[ ] Math emulation
[*] MTRR (Memory Type Range Register) support
[*] Enable kernel irq balancing
[ ] Use register arguments (EXPERIMENTAL)
05.Power management options (ACPI, APM) —>; 电源管理 自定 (偶没选)
06.Bus options (PCI, PCMCIA, EISA, MCA, ISA) —>; 板卡支持 自定
[*] PCI support
PCI access mode (Any) —>;
[ ] Message Signaled Interrupts (MSI and MSI-X)
[*] Legacy /proc/pci interface
[*] PCI device name database
[ ] ISA support
[ ] MCA support
< >; NatSemi SCx200 support
07.Executable file formats —>;
[*] Kernel support for ELF binaries
<M>; Kernel support for a.out and ECOFF binaries
<M>; Kernel support for MISC binaries
08.Device Drivers —>; 设备驱动及网络支持
Generic Driver Options —>; 默认
[*] Select only drivers that don’t need compile-time external firmware
[*] Prevent firmware from being built
Memory Technology Devices (MTD) —>; 不选
Parallel port support —>; 并行端口 自定(偶没选)
Plug and Play support —>; 支持热插拔 自定(偶没选)
Block devices —>;
<*>; Normal floppy disk support
< >; Compaq SMART2 support
< >; Compaq Smart Array 5xxx support
< >; Mylex DAC960/DAC1100 PCI RAID Controller support
< >; Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)
<M>; Loopback device support
< >; Cryptoloop Support
<M>; Network block device support
< >; Promise SATA SX8 support
<M>; RAM disk support
(16) Default number of RAM disks
(4096) Default RAM disk size (kbytes)
() Source directory of cpio_list
[ ] Support for Large Block Devices
< >; Packet writing on CD/DVD media
IO Schedulers —>; IO调度器,都选上吧 可以在grub.conf指定用IO调度哪种方式,后面会讲的
<*>; Anticipatory I/O scheduler
<*>; Deadline I/O scheduler
<*>; CFQ I/O scheduler
ATA/ATAPI/MFM/RLL support —>; ATA设备 自定 (偶没选)
SCSI device support —>; SCSI设备 自定我有scsi的设备所以有以下选项
<*>; SCSI device support
[*] legacy /proc/scsi/ support
— SCSI support type (disk, tape, CD-ROM)
<*>; SCSI disk support
因为偶式MPT的SCSI,所以以下都没选,省略之
Multi-device support (RAID and LVM) —>; 支持RAID和LVM(逻辑卷) 自定
[*] Multiple devices driver support (RAID and LVM)
<*>; RAID support
< >; Linear (append) mode
<*>; RAID-0 (striping) mode
< >; RAID-1 (mirroring) mode
< >; RAID-10 (mirrored striping) mode (EXPERIMENTAL)
<*>; RAID-4/RAID-5 mode
< >; RAID-6 mode (EXPERIMENTAL)
<*>; Multipath I/O support
< >; Faulty test module for MD
<*>; Device mapper support
< >; Crypt target support
< >; Snapshot target (EXPERIMENTAL)
< >; Mirror target (EXPERIMENTAL)
< >; Zero target (EXPERIMENTAL)
Fusion MPT device support —>; 偶的SCSI是这个,所以选了 还是自定
<*>; Fusion MPT (base + ScsiHost) drivers
(40) Maximum number of scatter gather entries
<*>; Fusion MPT misc device (ioctl) driver
IEEE 1394 (FireWire) support —>; 自定 (偶没选)
I2O device support —>; 自定 (偶没选)
Networking support —>; 网络选项
[*] Networking support
Networking options —>;
<*>; Packet socket
[ ] Packet socket: mmapped IO
< >; Netlink device emulation
<*>; Unix domain sockets 如果你有网络就选
< >; PF_KEY sockets
[*] TCP/IP networking
[ ] IP: multicasting
[ ] IP: advanced router
[ ] IP: kernel level autoconfiguration
< >; IP: tunneling
< >; IP: GRE tunnels over IP
[ ] IP: ARP daemon support (EXPERIMENTAL)
[*] IP: TCP syncookie support (disabled per default) 能防DOS攻击,但会降低一点性能,总的说性价比不错
< >; IP: AH transformation
< >; IP: ESP transformation
< >; IP: IPComp transformation
< >; IP: tunnel transformation
<*>; IP: TCP socket monitoring interface
IP: Virtual Server Configuration —>; lvs 支持
< >; The IPv6 protocol (EXPERIMENTAL)
[*] Network packet filtering (replaces ipchains) —>; 包过滤省略(知道的自己选,不熟悉的都选上)
以下都没选,省略
[ ] Amateur Radio support —>;
< >; IrDA (infrared) subsystem support —>;
< >; Bluetooth subsystem support —>;
[*] Network device support
< >; Dummy net driver support 这个是nis服务器的吧,不大清楚,没用过
<*>; Bonding driver support 双网卡绑定的
< >; EQL (serial line load balancing) support
< >; Universal TUN/TAP device driver support
ARCnet devices —>;
Ethernet (10 or 100Mbit) —>;
Ethernet (1000 Mbit) —>;
< >; Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support
< >; D-Link DL2000-based Gigabit Ethernet support
< >; Intel(R) PRO/1000 Gigabit Ethernet support
< >; National Semiconduct DP83820 support
< >; Packet Engines Hamachi GNIC-II support
< >; Packet Engines Yellowfin Gigabit-NIC support (EXPERIMENTAL)
< >; Realtek 8169 gigabit ethernet support
< >; Marvell Yukon Chipset / SysKonnect SK-98xx Support
<*>; Broadcom Tigon3 support
以下都没选,省略
ISDN subsystem —>;
Telephony Support —>;
Input device support —>;
Character devices —>;
I2C support —>;
Dallas’s 1-wire bus —>;
Misc devices —>;
Multimedia devices —>;
Graphics support —>;
Sound —>;
USB support —>;
MMC/SD Card support —>; 以上都没选,需要的自己选
09.File systems —>; 文件系统
< >; Second extended fs support
<*>; Ext3 journalling file system support
[ ] Ext3 extended attributes
[*] JBD (ext3) debugging support
< >; Reiserfs support
< >; JFS filesystem support
< >; XFS filesystem support
< >; Minix fs support
< >; ROM file system support
[ ] Quota support
< >; Kernel automounter support
<*>; Kernel automounter version 4 support (also supports v3)
CD-ROM/DVD Filesystems —>;
<*>; ISO 9660 CDROM file system support
[ ] Microsoft Joliet CDROM extensions
[ ] Transparent decompression extension
< >; UDF file system support
DOS/FAT/NT Filesystems —>; floppy要用到的文件格式
<*>; MSDOS fs support
<*>; VFAT (Windows-95) fs support
(437) Default codepage for FAT (NEW)
(iso8859-1) Default iocharset for FAT (NEW)
< >; NTFS file system support
Pseudo filesystems —>;
[*] /proc file system support proc文件系统支持
[ ] /proc/kcore support
[ ] /dev file system support (OBSOLETE)
[ ] /dev/pts Extended Attributes
[*] Virtual memory file system support (former shm fs) 虚拟内存支持
[ ] tmpfs Extended Attributes
[ ] HugeTLB file system support
Miscellaneous filesystems —>;
Network File Systems —>;
<*>; NFS file system support nfs客户端支持
[*] Provide NFSv3 client support
[ ] Provide NFSv4 client support (EXPERIMENTAL)
[ ] Allow direct I/O on NFS files (EXPERIMENTAL)
< >; NFS server support nfs服务端支持
< >; Secure RPC: Kerberos V mechanism (EXPERIMENTAL)
< >; Secure RPC: SPKM3 mechanism (EXPERIMENTAL)
< >; SMB file system support (to mount Windows shares etc.) samba支持
< >; CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)
< >; NCP file system support (to mount NetWare volumes)
< >; Coda file system support (advanced network fs)
< >; Andrew File System support (AFS) (Experimental)
Partition Types —>;
Native Language Support —>; 自己选
10.Profiling support —>; 没选
11.Kernel hacking —>; 没选
12.Security options —>; 没选
13.Cryptographic options —>; 没选
14.Library routines —>;
< >; CRC-CCITT functions
<*>; CRC32 functions
<M>; CRC32c (Castagnoli, et al) Cyclic Redundancy-Check
五、编译安装
步骤:make -jn(n代表同时编译的进程,可以加快编译速度,n由你的配置决定,我的配置用15-25)
make modules_install
make install

六、grub的设置
设置之前先介绍一下2.6的I/O调度器
2.6包含的四个I/O调度器分别是No-op I/O scheduler、Anticipatory I/O scheduler、Deadline I/O scheduler与CFQ I/O scheduler。
在后文中分别简称为ns、as、ds与cfq。

ns是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件
与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。

as是当前内核中默认的I/O调度器。它拥有非常好的性能,在2.5中它就相当引人注意。在与2.4内核进行的对比测试中,在2.4中多项以分钟为单位
完成的任务,它则是以秒为单位来完成的。正因为如此它成为目前2.6测试版中默认的I/O调度器。但它也存在着弱点,它本身是比较庞大与复杂的,
在一些特殊的情况下,特别是在数据吞吐量非常大的数据库系统中它会变的比较缓慢。

ds就是针对as的缺点进行改善而来的,还处于测试阶段,但已经很稳定了。目前表现出的性能几乎与as一样好。加之比as更加小巧,
是相当有前途的调度器,值得一试:)

cfq为系统内的所有任务分配相同的带宽,提供一个公平的工作环境,它比较适合桌面环境。事实上在测试中它也有不错的表现,
mplayer xmms等多媒体播放器与它配合的相当好,回放平滑几乎没有因访问磁盘而出现的跳帧现象。对于喜欢在Linux下听音乐看电影的朋友不妨尝试一下。

好了,下面说说怎么设置:参数的格式为elevator=调度器名

修改/boot/grub/grub.conf,在kernel那行后门加入elevator=deadline

例如:kernel /boot/vmlinuz-2.6.10-bk4 ro root=/dev/你的根分区 elevator=deadline

七、reboot

分类: Linux入门大全 标签:

Linux内核升级全过程 手把手教你一次成功(2.4.20-8到2.6.18)

2015年9月17日 评论已被关闭

Linux内核升级全过程 手把手教你一次成功(2.4.20-8到2.6.18)

http://blog.chinaunix.net/uid-8318378-id-2032187.html

=============================
时间:2007-01-08
作者:飘扬
首发:http://www.piaoyang.org/blog
Q Q: 47720194
邮箱:piaoyang168#163.com
=============================

序  言
由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。
网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。
现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!

一、准备工作
首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。
启动Linux系统,并用根用户登录,进入终端模式下。

1、查看Linux内核版本
# uname -a
如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。

2、下载2.6内核源码
下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2

3、下载内核升级工具
(1)下载module-init-tools-3.2.tar.bz2
http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2
(2)下载mkinitrd-4.1.18-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm
(3)下载lvm2-2.00.25-1.01.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm
(4)下载device-mapper-1.00.19-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm
(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到http://www.piaoyang.org/guestbook 留下你的邮箱,我给你发过去)

二、配置工作
好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。

4、将下载好的内核源码包和4个升级工具都拷贝到/usr/src文件夹下。怎么拷贝就不用我教了吧~~~~不会拷贝的去撞墙吧!~~呵呵!

5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:
# cd /usr/src  (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)
# rm –rf linux  (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)
# tar jvxf linux-2.6.18.tar.bz2  (解压新内核)
# ln -s linux-2.6.18 linux  (重新生成linux文件夹)

6、安装module-init-tools工具
在/usr/src目录下,依次执行下列命令:
# tar jvxf module-init-tools-3.2.tar.bz2  (解压module-init-tools)
# cd module-init-tools-3.2  (由/usr/src目录进入module-init-tools目录下)
#./configure –prefix=/
# make moveold
# make all install
#./generate-modprobe.conf /etc/modprobe.conf

7、安装另外三个升级工具
回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:
# rpm -ivh –nodeps mkinitrd-4.1.18-2.i386.rpm  (注意,这里一定要加入–nodeps参数,下同)
# rpm -ivh –nodeps lvm2-2.00.25-1.01.i386.rpm
# rpm -ivh –nodeps device-mapper-1.00.19-2.i386.rpm
如果不更新以上几个升级包,在后面编译内核时会提示以下错误:
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error 2

8、配置内核选项。有点繁琐,~~希望一次成功哦~~。
# cd linux-2.6.18  (进入到/usr/src/linux-2.6.18目录下)
# make mrproper  (该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (配置内核各选项)
此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):
(1)Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;
(2)Device Drivers—>Block Devices中选上“Loopback device support”;
Device Drivers—>Multi-device support(RAID and LVM)处要选上“device mapper  support”;
Device Drivers—>Graphics support,一定要选上“ Support for frame buffer devices”;
Device Drivers  —>USB support  —>选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)
Device Drivers  —>;Network device support  —>Ethernet (10 or 100Mbit)  —><*>  AMD PCnet32 PCI support
(3)File system—>(以下9个选项是关于ext2和ext3文件系统配置,全部选上)
Second extended fs support
Ext2 extended attributes
Ext2 POSIX Access Control Lists
Ext2 Security Labels
Ext3 journalling file system support
Ext3 extended attributes
Ext3 POSIX Access Control Lists
Ext3 Security Labels
JBB (ext3) debugging support
File system—>DOS/FAT/NT Filesystems  —>选上“NTFS file system support”;
注意:
ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:
kernel panic : no init found ,try passing init = option to kernel…..
或者是:
VFS:Cannot open root device “hdxy” or unknow-block(0,0)
Please append a correct “root=” boot option
kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
或者是:
mount: error 19 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc fail: 2
Freeing unused kernel memory: 244k freed
Kernel panic – not syncing: No init found. Try passing init = option to kernel
(我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~如果依照本文做完所有步骤,当你重启Linux系统后,若不幸进不去2.6.18内核,你会发现你的出错信息就是上面三种了~~~哈!)
(4)如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选:
Device Drivers —><*>SCSI device support  (此项不选的话,下面两项就选择不上)
Device Drivers —><*>SCSI device support —><*>SCSI disk support
Device Drivers—><8>SCSI device support—>SCSI low-level drivers—><*>; BusLogic SCSI support

三、编译工作
OK,繁杂的配置工作完成了,至此,编译前的准备工作都做好了!

9、开始编译啦……
在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
# make dep  (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean  (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage  (注意大小写。这一步才是真正编译内核)
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make  zImage编译,内核很大的话,系统会提示你使用make   bzImage命令来编译,所以我直接用make bzImage来编译。
# make modules  (编译可加载模块)
# make modules_install  (安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。
# make install  (安装新内核)
注意:
make install的时候可能会出现如下错误信息:
No module BusLogic found for kernel 2.4.12
mkinitrd failed
此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。解决方式是直接将BusLogic.o文件复制过去:
# cp /usr/src/linux-2.6.18/drivers/scsi/BusLogic.o  /lib/modules/2.6.18/kernel/drivers/scsi
不过别忘记,复制过后再执行一下make install。这一步若卡住了,下面的都无法进行,如果看本文档还是没有解决问题,就来我的网上留言本求助吧,进http://www.piaoyang.org ,点“留言本”即可,我会及时看到你的求助信息的。

四、启动新内核
10、将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:
# cp  /usr/src/linux-2.6.18/arch/i386/boot/bzImage   /boot/vmlinuz-2.6.18
# cp  /usr/src/linux-2.6.18/System.map   /boot/System.map-2.6.18
# cd  /boot  (进入boot目录)
# rm –rf  System.map  (删除原来的连接)
# ln –s System.map-2.6.18  System.map   (重新建立连接)

11、修改Grub启动管理器
如果没有错误的话, 下面开始修改grub配置文件(不要告诉我你用的lilo)
在/boot目录下,执行以下命令:
# new-kernel-pkg –mkinitrd –depmod –install 2.6.18 (这时候你的/boot下会生成一个initrd-2.4.18.img,并且你的grub.conf文件也作了相应更改)
# df  (查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是“/”,千万不要搞错哦。我的为 /dev/hda2)
# vi /grub/grub.conf
进入grub.conf文件,找到如下信息:
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root= LABEL=/
initrd /initrd-2.6.18.img
做两处修改:
(1) 将default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.4内核)
(2) 将kernel行的“LABEL=/”换成根目录所在的分区(上一步查看的就是)
此步很重要,修改错误将可能导致进不去系统,我把我修改后的grub.conf文件列出来,不明之处,可以对照修改:
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root=/dev/hda2
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img

12,OK,大功告成!赶快重启,看看升级后的2.6内核吧~~~~

后记:
Linux内核升级和编译,老掉牙的话题了,网上相关的文章不计其数。然后,这么多的文章,却没有一篇让我顺利的升级成功。经过两天的体验,我深切的感受到,对于像我这样的新手来说,第一次升级和编译Linux内核,真是一项艰巨的任务。好在没有失去耐心,经过多篇文章的比对和自己的琢磨,一次次的修正,终于正确升级、编译成功。总结这两天的感受,那就是“痛,并快乐着”!如果你照着这些步骤一路下来的话,仍然没有成功;那么我可以告诉你两点:一是,不要怀疑我的步骤有问题,因为不光是我,我的同事照我的这篇文档也一次成功;二是,你可以到我的留言本http://www.piaoyang.org/guestbook 给我留言,我会尽力解答你的问题。以此拙作,希望能给大家带去些微的帮助。

本文为飘扬原创,首发飘扬博客,作者邮箱piaoyang168#163.com,请尊重版权,转载请保留本行说明。

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1499054

linux内核编译常常出现的问题的解决办法

2015年9月17日 评论已被关闭

linux内核编译常常出现的问题的解决办法

http://www.kafan.cn/edu/1504942.html

1、若编译内核时总是出现同一个错误,如下:
在make modules_install时最后几行弹出错误:
if [ -r System.map -a -x /sbin/depmod ]; then /sbin/depmod -ae -F System.map 2.6.12.2; fi
/bin/sh: line 1: 3357 已杀死 /sbin/depmod -ae -F System.map 2.6 .12.2
make: *** [_modinst_post] 错误 137
如果继续make install,重启,是进不去刚刚编译安装的那个内核的,显示内核错误。
分析:如果 System.map可读 并且 /sbin/depmod可执行;那么就执行/sbin/depmod -ae -F System.map 2.6.20;结束
depmod(depend module)
功能说明:分析可载入模块的相依性。
语 法:depmod [-adeisvV][-m <文件>][–help][模块名称]
补充说明:depmod可检测模块的相依性,供modprobe在安装模块时使用。
参 数:
-a或–all 分析所有可用的模块。
-d或debug 执行排错模式。
-e 输出无法参照的符号。
-i 不检查符号表的版本。
-m<文件>或system-map<文件> 使用指定的符号表文件。
-s或–system-log 在系统记录中记录错误。
-v或–verbose 执行时显示详细的信息。
-V或–version 显示版本信息。
–help 显示帮助。
解决方法:make module_install之前你是否关闭了selinux,
该问题是selinux阻止写/lib/modules/ <version> 目录
2、若重启系统后显示:
Warning–SElinux relabel is required
Disabling security enforcement
Relabeling could take a very long time
depending on file system size
可以更改grub.conf 将selinux=0添加到如下位置
kernel /vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ selinux=0 rhgb quiet
或者更改/etc/selinux/config,将SELINUX=Disabled,存盘就可以把 selinux 关闭了
3、修改selinux
在新版本中的Red Hat 和 Fedora 上,修改档案/etc/sysconfig/selinux:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted – Only targeted network daemons are protected.
# strict – Full SELinux protection.
SELINUXTYPE=targeted
把 SELINUX设定为disable, 下次启动系统后将会停止SElinux.
Linux核心参数(Kernel Parameter)
或者可以在核心参数后加上: selinux=0 (停止) 或 selinux=1 (开启)参数
档案/boot/grub/menu.lst
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet selinux=0
initrd /initrd-2.6.18-1.2798.fc6.img
检查SELinux现时况态
要知到你现在是否使用 SELinux:
# getenforce
disabled
4、重启后若出现Kernel panic:VFS: Unable to mount root fs on unknown-block(0,0)
从错误信息上看,是没有识别到硬盘。看来,我机器上的SATA硬盘必须在内核中做相应的配置才能识别。
仔细阅读了内核配置时的帮助信息,得知内核支持两种SATA驱动程序:一种是libata,在SCSI子系统中,支持最新的SATA控制器;还有一种是 IDE驱动程序中的SATA,主要是支持第一代的SATA控制器。我的机器应该是比较新的,所以先按libata的方式来配置试试。
先看看我的SATA控制器是什么类型的?运行lspci,输出如下:
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Con troller (rev 01)
就是SATA控制器的类型。
解决方法:在make menuconfig中设置以下选项:
Device Driver
|—->SCSI device support
|—->SCSI disk support
|—–>verbose SCSI error reporting (不是必须的,但可方便问题定位)
|—–>SCSI low-level drivers
|—->Serial ATA (SATA) support
|—->intel PIIX/ICH SATA support
<*> RAM disk support 在 device drivers -> Block devices中
<*> Initial RAM disk (initrd) support 在 device drivers -> Block devices中
<*> Compressed ROM file system support (cramfs) 在file systems -> Miscellaneous filesystems中
5、若重启之后出现网卡不识别,无法激活,出现via-rhine device eth0 does not seem to be present, delaying initialization
缺少VIA 驱动
运行 make menuconfig
在Networking support–>Networking device support –> Ethernet (10 or 100Mbit) 里找到 <M>”VIA Rhine RevB support”
6、若重启后显示如下:
reading all physical volumns, this may take a while…
no volumns group found!
unable to find volumns group “VolGroup00”
ERROR: /bin/lvm exited abnormal with value 5 (pid 335)
error 6 mounting ext3
ERROR OPENING /dev/console!!:2
error dup2ing fd of 0 to 0
error dup2ing fd of 1 to 1
error duping fd of 2 to 2
switchroot:mount failed:22
kernel panic – no syncing: attempted to kill init!
运行make menuconfig时在 device drivers ->[*] Multiple devices driver support (RAID and LVM)
如果有以下选项,也应该启用它们:<*> Logical volume manager (LVM) support

分类: Linux入门大全 标签: