存档

‘Linux系统管理’ 分类的存档

NFS文件系统详解以及安全设置

2017年8月10日 评论已被关闭

## 1、什么是NFS
The Network File System(NFS),网络文件系统。它允许挂载一个远程主机的硬盘分区,就相于使用本地硬盘一样.
## 2、搭建一个NFS服务器。
### 2.1.1、安装。
#yum -y install nfs*
### 2.1.2、nfs配置文件
nfs主要有三个配置文件/etc/exports,/etc/hosts.allow,/etc/hosts.deny。通常只需要编辑一个/etc/exports文件就可以让nfs工作。但是它不够安全,要用hosts.allow和hosts.deny文件来限制一些客户的访问。我先讲解/etc/exports文件配置,稍后再来讲解/etc/hosts.allow,/etc/hosts.deny两个文件的配置。
### 2.1.3、/etc/exports
这个文件包含一个条目列表,每个条目表示一个卷的共享以及是如何共享的。例如文件中有个条目是:
/usr/local/src 192.168.1.252(rw,sync,no_root_squash)
说明:/usr/local/src: 是要共享的目录,在/usr/local/src下的所有子目录和文件也将被共享。
192.168.1.252:客户机的ip能够访问/usr/local/src目录。
(rw):设置客户机对/home目录的权限,可读可写,(ro)为只读权限。
启动服务:
# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]

### 2.1.4、解释/etc/hosts.allow和/etc/hosts.deny配置文件

这两个文件是指定网络上哪些计算机可以使用nfs服务,该文件的每一个条目录,指定一个服务和一个或一组主机。当一个主机请求nfs服务,它会进行以下操作:
首先会去检查hosts.allow文件是否匹配里面的条目,如果匹配,则允许访问nsf服务。
如果不匹配hosts.allow文件中的条目,服务将会去检查hosts.deny文件,如果匹配,则拒绝访问。
如果客户端不匹配两个文件中的条目,则允许访问。
配置/etc/hosts.deny禁止所有用户访nfs的守护进程。只有hosts.allow文件指定的ip才能访问。内容如下:
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
配置/etc/hosts.allow文件允许192.168.1.252访问nfs.
格式:
service: host [or network/netmask] , host [or network/netmask]
添加以下内容:
portmap: 192.168.1.252
lockd: 192.168.1.252
rquotad: 192.168.1.252
mountd: 192.168.1.252
statd: 192.168.1.252

## 3、客户端配置
在192.168.1.252上执行
#mount -t nfs 192.168.1.251:/usr/local/src /data/src
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.6G 3.5G 2.9G 56% /
/dev/sda1 190M 17M 164M 10% /boot
tmpfs 62M 0 62M 0% /dev/shm
/dev/hdc 2.9G 2.9G 0 100% /mnt/cdrom
192.168.1.251:/usr/local/src
7.5G 3.0G 4.1G 43% /data/src
nfs文件系统成功挂载到客户端。

分类: Linux系统管理 标签:

部署tinyproxy代理服务

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

线上需要一个https的透明代理,开始打算用nginx,调试了一段时间发现配置较复杂且没有成功。后来用的tinyproxy做的透明代理。安装配置过程就是下载、解压、编译、安装、配置、启动一波流:

安装依赖

yum install asciidoc

下载

wget https://github.com/tinyproxy/tinyproxy/releases/download/1.8.4/tinyproxy-1.8.4.tar.gz -O tinyproxy-1.8.4.tar.gz

解压

tar xvfz tinyproxy.1.8.4.tar.gz

编译配置

./configure –enable-transparent –prifix=/usr/local/tinyproxy

更多的编译选项可以参考源码目录的README文件,部分说明如下:

./configure
make

make install

in the top level directory to compile and install Tinyproxy. There are
additional command line arguments you can supply to configure. They
include:

--enable-debug        If you would like to turn on full
            debugging support
--enable-xtinyproxy    Compile in support for the XTinyproxy
            header, which is sent to any web
            server in your domain.
--enable-filter        Allows Tinyproxy to filter out certain
            domains and URLs.
--enable-upstream    Enable support for proxying connections
            through another proxy server.
--enable-transparent
            Allow Tinyproxy to be used as a
            transparent proxy daemon
--enable-static        Compile a static version of Tinyproxy

    --with-stathost=HOST    Set the default name of the stats host

Support

编译

make

安装

make install
修改配置文件一般需要指定用户、用户组、端口、访问IP段,当然这些都有默认值,然后启动程序和测试。

启动程序:

/usr/local/tinyproxy/sbin/tinyproxy -c /usr/local/tinyproxy/etc/tinyproxy.conf

测试代理节点是否生效(假设代理程序安装在10.10.10.10的机器,监听的是8888端口):

curl url –proxy 10.10.10.10:8888

如果是https代理加 -k 参数

curl url –proxy 10.10.10.10:8888 -k
关于配置文件的一点补充:

添加多段IP地址

Allow 10.27.80.0/24
Allow 11.65.48.0/24
Allow 18.90.12.145

添加head信息,https的代理不能添加(一条信息一条记录和ip访问限制设置一样)

AddHeader "Referer" "http://www.baidu.com"

分类: Linux系统管理 标签:

NFS共享服务挂载时出现“access denied by server while mounting”的解决方法

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

NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
http://www.2cto.com/os/201305/215679.html
笔者用的Linuxf发行版本为Centos6.4,以下方法理论上讲对于Fedora, Red Hat均有效:

搭建好NFS服务后,如果用以下的命令进行挂载:

# mount -t nfs 172.16.12.140:/home/liangwode/test /mnt

出现如下错误提示:

mount.nfs: access denied by server while mounting 172.16.12.140:/home/liangwode/test
那我们可以用以下的方法进行解决:

修改/etc/sysconfig/nfs文件,将

# Turn off v2 and v3 protocol support
# RPCNFSDARGS=”-N 2 -N 3″
# Turn off v4 protocol support
#RPCNFSDARGS=”-N 4″ /*把这句话的#号去掉*/
NFS分为三个版本,即NFS-2 NFS-3 NFS-4,该配置文件默认关闭了这三个的NFS版本,我们只需要打开NFS-4即可。

问题解决!!!
NFS共享服务挂载时出现“access denied by server while mounting”的解决方法

笔者用的Linuxf发行版本为Centos6.4,以下方法理论上讲对于Fedora, Red Hat均有效:

搭建好NFS服务后,如果用以下的命令进行挂载:

# mount -t nfs 172.16.12.140:/home/liangwode/test /mnt

出现如下错误提示:

mount.nfs: access denied by server while mounting 172.16.12.140:/home/liangwode/test
那我们可以用以下的方法进行解决:

修改/etc/sysconfig/nfs文件,将

# Turn off v2 and v3 protocol support
# RPCNFSDARGS=”-N 2 -N 3″
# Turn off v4 protocol support
#RPCNFSDARGS=”-N 4″ /*把这句话的#号去掉*/
NFS分为三个版本,即NFS-2 NFS-3 NFS-4,该配置文件默认关闭了这三个的NFS版本,我们只需要打开NFS-4即可。

问题解决!!!

linux各种IPC机制

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

linux各种IPC机制

http://blog.sina.com.cn/s/blog_62a9b1bb0100t2a7.html
原文地址:linux各种IPC机制(转)作者:jianpengliu
原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了。
一)Linux环境进程间通信(一)管道及有名管道
http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/
二)Linux环境进程间通信(二): 信号
上:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
下:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html
三)Linux环境进程间通信(三)消息队列
http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
四)Linux环境进程间通信(四)信号灯
http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
五)Linux环境进程间通信(五): 共享内存
上:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html
下:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html
六)Linux环境进程间通信(六): socket
http://www.ibm.com/developerworks/cn/linux/l-ipc/

==============================================================================================

linux下进程间通信的几种主要手段简介:

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
管道的主要局限性正体现在它的特点上:

只支持单向数据流;
只能用于具有亲缘关系的进程之间;
没有名字;
管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
管道常用于两个方面:(1)在shell中时常会用到管道(作为输入输入的重定向),在这种应用方式下,管道的创建对于用户来说是透明的;(2)用于具有亲缘关系的进程间通信,用户自己创建管道,并完成读写操作。
FIFO可以说是管道的推广,克服了管道无名字的限制,使得无亲缘关系的进程同样可以采用先进先出的通信机制进行通信。
管道和FIFO的数据是字节流,应用程序之间必须事先确定特定的传输”协议”,采用传播具有特定意义的消息。
要灵活应用管道及FIFO,理解它们的读写规则是关键。
一、信号及信号来源
信号本质
信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。
信号来源
信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

三、进程对信号的响应
进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作,详细情况请参考[2]以及其它资料。注意,进程对实时信号的缺省反应是进程终止。
Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。
一、信号生命周期
从信号发送到信号处理函数的执行完毕
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。
linux IPC快餐(转) – xsh8637 – 第七天堂

消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像”即时”的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent),见 附录 1;管道及有名管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制。
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的(参见 附录 1)。

三、消息队列的限制
每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同。
小结:
消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式字节流,有利于减少开发人员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。

信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。
一、信号灯概述
信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号灯有以下两种类型:

二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。
注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。
五、信号灯的限制
1、 一次系统调用semop可同时操作的信号灯数目SEMOPM,semop中的参数nsops如果超过了这个数目,将返回E2BIG错误。SEMOPM的大小特定与系统,redhat 8.0为32。
2、 信号灯的最大数目:SEMVMX,当设置信号灯值超过这个限制时,会返回ERANGE错误。在redhat 8.0中该值为32767。
3、 系统范围内信号灯集的最大数目SEMMNI以及系统范围内信号灯的最大数目SEMMNS。超过这两个限制将返回ENOSPC错误。redhat 8.0中该值为32000。
4、 每个信号灯集中的最大信号灯数目SEMMSL,redhat 8.0中为250。 SEMOPM以及SEMVMX是使用semop调用时应该注意的;SEMMNI以及SEMMNS是调用semget时应该注意的。SEMVMX同时也是semctl调用应该注意的。

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。linux发行版本如Redhat 8.0支持mmap()系统调用及系统V共享内存,但还没实现Posix共享内存,本文将主要介绍mmap()系统调用及系统V共享内存API的原理及应用。

二、mmap()及其相关系统调用
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
结论:
共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。
共享内存涉及到了存储管理以及文件系统等方面的知识,深入理解其内部机制有一定的难度,关键还要紧紧抓住内核使用的重要数据结构。系统V共享内存是以文件的形式组织在特殊文件系统shm中的。通过shmget可以创建或获得共享内存的标识符。取得共享内存标识符后,要通过shmat将这个内存区映射到本进程的虚拟地址空间。
一个套接口可以看作是进程间通信的端点(endpoint),每个套接口的名字都是唯一的(唯一的含义是不言而喻的),其他进程可以发现、连接并且与之通信。通信域用来说明套接口通信的协议,不同的通信域有不同的通信协议以及套接口的地址结构等等,因此,创建一个套接口时,要指明它的通信域。比较常见的是unix域套接口(采用套接口机制实现单机内的进程间通信)及网际通信域。

5、网络编程中的其他重要概念
下面列出了网络编程中的其他重要概念,基本上都是给出这些概念能够实现的功能,读者在编程过程中如果需要这些功能,可查阅相关概念。
(1)、I/O复用的概念
I/O复用提供一种能力,这种能力使得当一个I/O条件满足时,进程能够及时得到这个信息。I/O复用一般应用在进程需要处理多个描述字的场合。它的一个优势在于,进程不是阻塞在真正的I/O调用上,而是阻塞在select()调用上,select()可以同时处理多个描述字,如果它所处理的所有描述字的I/O都没有处于准备好的状态,那么将阻塞;如果有一个或多个描述字I/O处于准备好状态,则select()不阻塞,同时会根据准备好的特定描述字采取相应的I/O操作。
(2)、Unix通信域
前面主要介绍的是PF_INET通信域,实现网际间的进程间通信。基于Unix通信域(调用socket时指定通信域为PF_LOCAL即可)的套接口可以实现单机之间的进程间通信。采用Unix通信域套接口有几个好处:Unix通信域套接口通常是TCP套接口速度的两倍;另一个好处是,通过Unix通信域套接口可以实现在进程间传递描述字。所有可用描述字描述的对象,如文件、管道、有名管道及套接口等,在我们以某种方式得到该对象的描述字后,都可以通过基于Unix域的套接口来实现对描述字的传递。接收进程收到的描述字值不一定与发送进程传递的值一致(描述字是特定于进程的),但是特们指向内核文件表中相同的项。
(3)、原始套接口
原始套接口提供一般套接口所不提供的功能:

原始套接口可以读写一些用于控制的控制协议分组,如ICMPv4等,进而可实现一些特殊功能。
原始套接口可以读写特殊的IPv4数据包。内核一般只处理几个特定协议字段的数据包,那么一些需要不同协议字段的数据包就需要通过原始套接口对其进行读写;
通过原始套接口可以构造自己的Ipv4头部,也是比较有意思的一点。

创建原始套接口需要root权限。
(4)、对数据链路层的访问
对数据链路层的访问,使得用户可以侦听本地电缆上的所有分组,而不需要使用任何特殊的硬件设备,在linux下读取数据链路层分组需要创建SOCK_PACKET类型的

多网卡多IP策略路由配置

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

多网卡多IP策略路由配置

 

http://blog.druggo.org/post/2015/10/03/多网卡多IP策略路由配置

默认外网eth1, 默认路由不用改, 为了正确路由到内网eth0:

 

新增外网 eth2, NewIP 配置路由:

 

ip route add default via NewGW dev eth2 src NewIP table 200

ip rule add from NewIP table 200

ip rule add fwmark 0x200 table 200

配置iptables mangle 表: ( eth0 : LAN )

 

-A PREROUTING -i eth0 -m conntrack –ctstate RELATED,ESTABLISHED -j CONNMARK –restore-mark

-A PREROUTING -i eth2 -m conntrack –ctstate NEW -j CONNMARK –set-mark 0x200

配置rp_filter:

 

net.ipv4.conf.all.rp_filter = 2

net.ipv4.conf.eth2.rp_filter = 2

分类: Linux系统管理 标签:

linux下实现端口转发两种方法

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

linux下实现端口转发两种方法
http://blog.chinaunix.net/uid-20638738-id-1909146.html
在Linux下面可以利用两个工具实现不同的转发,一个是防火墙工具iptables,另一个是ssh隧道。

假设现在有一个服务器集群,其中front是集群前端节点,back是后端极点,front可以再外网访问,back和front在一个内网里面,不能被外界直接访问。back在8080端口上启用了web服务,现在要实现外部计算机public能访问back上的web服务。

利用iptables,在front上做如下配置即可
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -d –dport 80 \
-J DNAT –to-destination :8080
iptables -t nat -A POSTROUTING -p tcp -s –sport 8080 \
-J SNAT –to-source
利用ssh打开一个ssh隧道
ssh -L *:80::8080 localhost
比较:
用iptables和其他防火墙规则配合,不会受到防火墙及其他软件影响,但是如果只是作为临时的转发,还是比较麻烦。相对来说ssh隧道就比较简单,普通用户就可以运行但是它有可能受到防火墙的限制,而且要ssh服务器支持端口转发。所以,前者适合于稳定长期使用的端口转发,儿后者适合于建立临时的转发功能。

分类: Linux系统管理 标签:

NAT 跟默认网关的问题(dual NAT)

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

NAT 跟默认网关的问题(dual NAT)

http://www.aikaiyuan.com/9153.html

由于要做数据同步,需要对我们内网的机器做 1 对 1 IP nat map,这样可以通过访问一台 nat 路由设备 map 到我们内网的机器。

先说常规性的做法。
一般情况下,这台 nat 设备会充当内网的 gateway,这样在这台 nat 上做一个 dnat 就可以顺利解决了。比如我 GW 的地址是 192.168.1.24,我想通过一对一的方式 map 到后面的 192.168.1.33 这台开放了 28017 TCP 的机器:
# iptables -t nat -A PREROUTING -d 192.168.1.24 -j DNAT –to-destination 192.168.1.33

像上面这样就可以了,但是如果 192.168.1.24 这台机器本身就开放了 28017 端口则会比较悲剧,因此,另外一种做法是选一个不存在的 IP,比如 192.168.1.200,这样可以任意的建立 socket 而不用担心其 TCP 端口被占用:
# iptables -t nat -A PREROUTING -d 192.168.1.200 -j DNAT –to-destination 192.168.1.33

当然,上面这两种方式都不是很规范,比较好的还是指定 IP 以及 port,像下面这样:
# iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.1.24 –dport 10000 -j DNAT   –to-destination 192.168.1.33:28017
上面的情况比较简单,现在来看看下面这种情况,也就是非常规性的做法,专业术语叫 “dual NAT”。
环境跟上面的不大一样,最终要访问的机器的 default gateway 并非指向了 nat 设备,也就是他们二者没有任何关系。具体的环境可以看superuser上的这个案例,在这种情况下,仅仅做一个 dnat 是不够的,还需要再做一次 snat 这样才能在回包的时候走正确的路由。
以他为例,在 client 把包发给 PC1 后,首先经过下面这条规则:
# iptables -t nat -A PREROUTING -p tcp -m tcp -d 1.0.0.1 –dport 80 -j DNAT  –to-destination 172.16.0.3:80

于是该包的 src(假设为 192.168.1.1:22222) 不变,dst 由 1.0.0.1:80 变成了 172.16.0.3:80,紧接着,经过 POSTROUTING:
# iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.16.0.3 –dport 80 -j SNAT –to-source 172.16.0.1:22222

于是该包的 src 由 192.168.1.1:22222 变成了 172.16.0.1:22222,这样修改后的包变成了 src 172.16.0.1:22222,dst 172.16.0.3:80,通过这种方式,成功的绕过了 PC3 default gateway 的问题。
如果仅仅包含 PREROUTING 这条 rule,那么包就变成了 src 192.168.1.1:2222,dst 172.16.0.3:80,虽然包能抵达 PC3,但是在返回的时候,PC1 发现原来的 (192.168.1.1:2222 <-> 1.0.0.1:80) 变成了 (192.168.1.1:2222 <-> 172.16.0.3:80),就直接发 R(Unskilled Attackers Pester Real Security Folks)标志了。可以看看我下面这个模拟的抓包结果:
16:06:36.694253 IP 192.168.1.1:2222 > 172.16.0.3.80: Flags [SEW], seq 868362120, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:06:36.694279 IP 172.16.0.3.80 > 192.168.1.1:2222: Flags [S.E], seq 1535533077, ack 868362121, win 5840, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:06:36.694591 IP 192.168.1.1:2222 > 172.16.0.3.80: Flags [R], seq 868362121, win 0, length 0

所以,记住,如果是这种非网关的形式,务必要 PREROUTING 跟 POSTROUTING 同时做。

理解了上面的问题,再说下我们线上的问题。当时脑子昏了随便找了台开启了 ip_forward 的服务器充当这台 NAT 设备,并且我只开启了 PREROUTING,结果可想而是,没法建立 TCP 链接,搞清楚了问题之后就找了台网关的机器,同时配备了内外网,从外界的客户端通过这个公网 IP 访问内部的机器就很简单了。同样的还是分两种情况,如果要访问的内部机器的 GW 指向这台 nat 设备,很简单,直接 PREROUING,如果没有指向,那么记得再添加一个 POSTROUTING:
# iptables -t nat -A PREROUTING -d nat_public_ip -j DNAT –to-destination  dst_server_ip
# iptables -t nat -A POSTROUTING -d dst_server_ip -j SNAT –to-source nat_private_ip

ref:

Linux-配置虚拟IP实例

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

Linux-配置虚拟IP实例
在日常linux管理工作中,需要为应用配置单独的IP地址,以达到主机与应用的分离,在应用切换与迁移过程中可以做到动态切换,特别是在使用HA的时候,这种方案可以保证主机与应用的隔离,对日常的运维有很大的益处.
但在有些应用中还没有配置HA,后期需要配置HA时,我们可以先配置虚拟IP给在线的应用使用,这要后期的系统运维可以做到更好的可扩展性.
本文主要是对IP地址如何配置做一些简单的介绍,只当是记录备忘.呵呵.

PS:以下实例在redhat linux实施成功!

1.在线配置虚拟IP

ifconfig eth0:1 192.168.109.108 netmask 255.255.255.0

2.查看新增加的子接口配置信息是否正确.主要是看IP与子网掩码.
ifconfig eth0:1
# ifconfig eth0:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:45:62:3B
inet addr:192.168.109.108 Bcast:192.168.109.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0x2000 Memory:d8920000-d8940000

3.启动网卡eth0的子接口
ifconfig eht0:1 up

查看IP是否可以联通
ping -c 3 192.168.109.108
# ping -c 3 192.168.109.108
PING 192.168.109.108 (192.168.109.108) 56(84) bytes of data.
64 bytes from 192.168.109.108: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.109.108: icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 192.168.109.108: icmp_seq=3 ttl=64 time=0.036 ms

— 192.168.109.108 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.032/0.040/0.053/0.010 ms

4.修改配置文件,使配置在主机重启后自动生效.

cd /etc/sysconfig/network-script/
cp ifcfg-eth0 ifcfg-eth0:1
vi ifcfg-eth0:1

# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0:1 —->子接口名
HWADDR=00:0C:29:45:62:3B
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.109.108
NETMASK=255.255.255.0

5.对于要切换主机IP与应用IP的情可以做如下处理
如 下面的例子:主机IP是192.168.109.105 应用IP是192.168.109.108
我们要将IP做对调,
192.168.109.108给主机使用
192.168.109.105给应用使用

做法如下:
配置前的信息:
#ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:45:62:3B
inet addr:192.168.109.105 Bcast:192.168.109.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe45:623b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20340 errors:0 dropped:0 overruns:0 frame:0
TX packets:16678 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1800154 (1.7 MiB) TX bytes:2438822 (2.3 MiB)
Base address:0x2000 Memory:d8920000-d8940000
# ifconfig eth0:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:45:62:3B
inet addr:192.168.109.108 Bcast:192.168.109.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0x2000 Memory:d8920000-d8940000

修改eth0:1的网卡配置信息:
# vi ifcfg-eth0:1

# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0:1 —->子接口名
HWADDR=00:0C:29:45:62:3B
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.109.105
NETMASK=255.255.255.0

修改eth0的网卡配置信息:
#vi ifcfg-eth0
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
HWADDR=00:0C:29:45:62:3B
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.109.108
NETMASK=255.255.255.0

重启网络生效:这一步很重要!!!

nohup service network restart &

将命令提交给后台去执行,这样子可以保证系统正常重启网络。

分类: Linux系统管理 标签:

linux网络配置相关命令、虚拟网络接口eth0:0

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

linux网络配置相关命令、虚拟网络接口eth0:0

http://desert3.iteye.com/blog/1672475

网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0、eth1…… ethX。而普通猫和ADSL的接口是 pppX,比如ppp0等;

机器中所有可用网卡、名字、配置文件:
dmesg | grep eth :可以看到系统启动时,网卡启动的信息及相应网卡的名字,然后就可以手动添加相应的/etc/sysconfig/network-scripts/ifcfg-ethX文件对网卡进行配置
ifconfig -a :查看所有处于激活状态和终止状态的网卡及相应信息
cat /proc/net/dev : 查看所有虚拟的eth文件
/dev/eth0,/dev/eth1 之类的文件在dev目录下找不到:在很多Unix操作系统中个,网络设备会出现在/dev目录下。但是在Linux下不是这样的。在Linux中,网络设备是被动态创建的,并不需要在/dev目录下生成设备文件。大部分的网络设备都是在初始化和加载硬件的时候被设备驱动程序自动创建。比如:ethernet 设备驱动器在加载ethernet 硬件的时候按顺序创建eth[0..n]网卡接口,第一个ethernet卡变成eth0,第二个ethernet卡变成eth1。这在Redhat 6.0安装盘的/doc/HOWTO目录下的NET-3-HOWTO中定义。可以通过虚拟文件:/proc/net/dev来查看被配置好的ethernet 设备属性。In many Unix operating systems the network devices have appearances in the /dev directory. This is not so in Linux. In Linux the network devices are created dynamically in software and do not require device files to be present. In the majority of cases the network device is automatically created by the device driver while it is initializing and has located your hardware. For example, the ethernet device driver creates eth[0..n] interfaces sequentially as it locates your ethernet hardware. The first ethernet card found becomes eth0, the second eth1 etc.” This was quoted from NET-3-HOWTO in the /doc/HOWTO directory of my RH 6.0 Install cdrom. You can see the settings for configured ethernet devices in the /proc/net/dev ‘pseudo file

网络配置相关命令:
/bin/hostname 显示主机名
/etc/rc.d/init.d/network 网络服务启动脚本(service network restart)
/sbin/ifconfig 查看、配置、启用或禁用网络接口(网卡)的IP地址、MAC地址、掩码、广播地址,if是网络接口(interface)的简写
/sbin/ifup ifdown 激活或者终止网络接口

/etc/init.d/network 网络服务启动脚本
Service network start|stop|reload|restart|status|force-reload

/sbin/ifconfig 查看、配置、启用或禁用网络接口(网卡)的工具
ifconfig 是一个用来查看、配置、启用或禁用网络接口的工具,这个工具极为常用的。比如我们可以用这个工具来配置网卡的IP地址、MAC地址、掩码、广播地址等。值得一说的是用ifconfig 为网卡指定IP地址,这只是用来调试网络用的,并不会更改系统关于网卡的配置文件。如果您想把网络接口的IP地址固定下来,目前有三个方法:一是通过各个发行和版本专用的工具来修改IP地址;二是直接修改网络接口的配置文件;三是修改特定的文件,加入ifconfig 指令来指定网卡的IP地址,比如在redhat或Fedora中,把ifconfig 的语名写入/etc/rc.d/rc.local文件中;

ifconfig配置网络接口语法:
ifconfig 网络端口 IP地址 hw MAC地址 netmask 掩码地址 broadcast 广播地址 [up/down]

ifconfig常用用法:
ifconfig : 查看主机激活状态的网络接口情况; 输出结果中:lo 是表示主机的回坏地址,eth0 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址(MAC地址); inet addr 用来表示网卡的IP地址,Bcast表示广播地址,Mask表示掩码地址
ifconfig -a : 查看主机所有(包括没有被激活的)网络接口的情况
ifconfig eth0 : 查看特定网络接口的状态
ifconfig eth0 down = ifup eth0 : 如果eth0是激活的,就把它终止掉。此命令等同于 ifdown eth0;
ifconfig eth0 up = ifdown eth0 : 激活eth0 ; 此命令等同于 ifup eth0
ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0 : 配置 eth0的IP地址、广播地址和网络掩码;
ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0 up : 配置IP地址、网络掩码、广播地址的同时,激活网卡eth0
ifconfig eth1 hw ether 00:11:00:00:11:22 : 设置网卡的物理地址(MAC地址)。其中 hw 后面所接的是网络接口类型, ether表示以太网, 同时也支持 ax25 、ARCnet、netrom等,详情请查看 man ifconfig ;

用ifconfig 来配置虚拟网络接口:
有时我们为了满足不同的需要还需要配置虚拟网络接口,比如我们用不同的IP地址来架运行多个HTTPD服务器,就要用到虚拟地址;这样就省却了同一个IP地址,如果开设两个的HTTPD服务器时,要指定端口号。

虚拟网络接口指的是为一个网络接口指定多个IP地址,虚拟接口是这样的 eth0:0 、 eth0:1、eth0:2 … .. eth1N。当然您为eth1 指定多个IP地址,也就是 eth1:0、eth1:1、eth1:2 … …以此类推;
ifconfig eth1:0 192.168.1.250 hw ether 00:11:00:00:11:44 netmask 255.255.255.0 broadcast 192.168.1.255 up
ifconfig eth1:1 192.168.1.249 hw ether 00:11:00:00:11:55 netmask 255.255.255.0 broadcast 192.168.1.255 up
注意:指定时,要为每个虚拟网卡指定不同的物理地址;

分类: Linux系统管理 标签:

关于eth0 eth0:1 和eth0.1关系介绍

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

关于eth0 eth0:1 和eth0.1关系介绍
http://www.cnblogs.com/sunzl1987/p/3790396.html
eth0 eth0:1 和eth0.1三者的关系对应于物理网卡、子网卡、虚拟VLAN网卡的关系:
物理网卡:物理网卡这里指的是服务器上实际的网络接口设备,这里我服务器上双网卡,在系统中看到的2个物理网卡分别对应是eth0和eth1这两个网络接口。

子网卡:子网卡在这里并不是实际上的网络接口设备,但是可以作为网络接口在系统中出现,如eth0:1、eth1:2这种网络接口。它们必须要依赖于物理网卡,虽然可以与物理网卡的网络接口同时在系统中存在并使用不同的IP地址,而且也拥有它们自己的网络接口配置文件。但是当所依赖的物理网卡不启用时(Down状态)这些子网卡也将一同不能工作。

虚拟VLAN网卡:这些虚拟VLAN网卡也不是实际上的网络接口设备,也可以作为网络接口在系统中出现,但是与子网卡不同的是,他们没有自己的配置文件。他们只是通过将物理网加入不同的VLAN而生成的VLAN虚拟网卡。如果将一个物理网卡通过vconfig命令添加到多个VLAN当中去的话,就会有多个VLAN虚拟网卡出现,他们的信息以及相关的VLAN信息都是保存在/proc/net/vlan/config这个临时文件中的,而没有独自的配置文件。它们的网络接口名是eth0.1、eth1.2这种名字。

注意:当需要启用VLAN虚拟网卡工作的时候,关联的物理网卡网络接口上必须没有IP地址的配置信息,并且,这些主物理网卡的子网卡也必须不能被启用和必须不能有IP地址配置信息。这个在网上看到的结论根据我的实际测试结果来看是不准确的,物理网卡本身可以绑定IP,并且给本征vlan提供通信网关的功能,但必须是在802.1q下。

分类: Linux系统管理 标签:

Stale NFS file handle的解决方法

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

Stale NFS file handle的解决方法
http://dikar.iteye.com/blog/634862
经常遇到这个问题每次都google,算了还是保留一份在自己的blog上好了,解决方法来自网络

转载自:http://www.abc188.com/info/html/wangzhanyunying/jianzhanjingyan/20080417/71458.html

Stale NFS file handle的解决方法
早上来到公司,发现有两台server有问题。 因为用df -k察看磁盘使用情况时,一台机器报如下错误: Stale NFS file handle。 另外一台整个就没反应。 后来查了一些资料,说是“ 当我们已mount 上的file or directory ,在server上突然被remove or unexport ,就会出现此讯
早上来到公司,发现有两台server有问题。
因为用df -k察看磁盘使用情况时,一台机器报如下错误:
Stale NFS file handle。
另外一台整个就没反应。
后来查了一些资料,说是“ 当我们已mount 上的file or directory ,在server上突然被remove or unexport ,就会出现此讯息“。
就是说,假如client端mount上了server端的directory之后,假如server端又将这个directory unshare了,那么就会在client端出现这个错误。

正文:

其实解决办法很简单,就是在client上把那个文档unmount掉。
可是其实做起来很难,因为经常会得到 is busy的错误。

能够用下面的三个方法:
1)用fuser杀掉占用那个目录的进程
fuser -k /directory

2)在启动的进程里面查找
ps -ef |awk ‘{print }’ |grep -v PID |xargs /usr/proc/bin/pwdx

这种方法只能在solaris8及以上版本使用

3)umount -f /directory
强制umount
上面的1跟2方法有时候并不能解决问题,能够这三个一起结合着使用。

分类: Linux系统管理 标签:

linux下NFS、FTP使用讲解

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

linux下NFS、FTP使用讲解
http://mofansheng.blog.51cto.com/8792265/1654731
一、NFS
1、NFS简介
NFS全称是network file system 网络文件系统nfs依赖网络带宽的支持
NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS用户和程序可以像访问本地文件一样访问远端系统上的文件。
假如有三台机器A, B, C它们需要访问同一个目录目录中都是图片传统的做法是把这些图片分别放到A, B, C. 但是使用NFS只需要放到A上然后A共享给B和C即可。访问的时候B和C是通过网络的方式去访问A上的那个目录的。

2、安装、配置NFS服务
需要安装两个包(nfs-utils和rpcbind)
#yum install -y nfs-utils 会同时安装上依赖包rpcbind

提供nfs服务的机器上 vim /etc/exports 输入以下内容
/home/ 192.168.20.0/24(rw,sync,all_squash,anonuid=501,anongid=501)
共分为三部分
/home/ 第一部分是本地要共享出去的目录
192.168.20.0/24 第二部分为允许访问的主机可以是一个IP也可以是一个IP段
(rw,sync,all_squash,anonuid=501,anongid=501) 第三部分就是小括号里面的为一些权限选项。权限为读写同步限定所有使用者并且限定的uid和gid都为501501账号必须真实存在。
启动nfs服务先启动rpcbind再启动nfs启动顺序错误的话会导致后面出错
/etc/init.d/rpcbind start
/etc/init.d/nfs start

3、NFS配置的一些选项说明
rw 可读可写
ro 只读
sync 同步模式内存中数据时时写入磁盘
async 不同步把内存中数据定期写入磁盘中
no_root_squash squash的意思为挤压压制字面意思为不压制root的权限加上这个选项后root用户就会对共享的目录拥有至高的权限控制就像是对本机的目录操作一样。不安全不建议使用
root_squash和上面的选项对应root用户对共享目录的权限不高只有普通用户的权限即限制了root
all_squash不管使用NFS的用户是谁他的身份都会被限定成为一个指定的普通用户身份
anonuid/anongid 要和root_squash 以及all_squash一同使用用于指定使用NFS的用户限定后的uid和gid前提是本机的/etc/passwd中存在这个uid和gid。

4、客户端上挂载NFS
客户端机器也同样需要安装nfs包# yum install -y nfs-utils
同时需要检查iptables清空iptables
关闭selinux防火墙
查看服务器端都共享了哪些目录 #showmount -e 192.168.20.30nfs服务器的ip地址
客户端使用showmount -e 时报错RPC程序没有注册
[root@yong ~]# showmount -e 192.168.20.30
clnt_create: RPC: Program not registered
出错原因是rpcbind服务与NFS服务启动顺序不对先停止服务重新启动先启动rpcbind服务再启动nfs服务

[root@localhost ~]# /etc/init.d/nfs stop
[root@localhost ~]# /etc/init.d/rpcbind stop
重新启动后执行显示正确

[root@localhost ~]# /etc/init.d/rpcbind start
[root@localhost ~]# /etc/init.d/nfs start
[root@yong ~]# showmount -e 192.168.20.30
Export list for 192.168.20.30:
/home 192.168.20.0/24

在客户端上挂载服务端的nfs命令
mount -t nfs -o nolock,nfsvers=3 192.168.20.30:/home/ /mnt/
//如果不加 -onolock,nfsvers=3 则在挂载目录下的文件属主和组都是nobody如果指定nfsvers=3则显示root
-o nolock 不上锁指定nfsvers版本是3默认是4
df -h 查看挂载的情况

实验测试nfs
服务器端共享/home目录允许192.168.20.0网段的机器访问指定使用nfs用户的身份为501

[root@localhost home]# cat /etc/exports
/home/ 192.168.20.0/24(rw,sync,all_squash,anonuid=501,anongid=501)
[root@localhost /]# ls -ld home/
drwxr-xr-x. 8 root root 4096 5月 22 11:33 home/
[root@localhost home]# ls -ld
rwxr-xr-x 2 root root 4096 5月 15 15:54 logs
drwx——. 3 mysql mysql 4096 5月 11 14:47 mysql
drwx——. 4 php-fpm php-fpm 4096 5月 13 14:24 php-fpm
drwx—— 2 test test 4096 5月 22 11:40 test
[root@localhost home]# mkdir 111
[root@localhost home]# chmod 777 111
客户端机器新建立文件夹nfs挂载nfs服务器的/home目录到nfs目录挂载后使用df -h查看已挂载的nfs

[root@yong ~]# mkdir nfs
[root@yong ~]# mount -t nfs 192.168.20.30:/home/ /root/nfs/
[root@yong ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
19G 2.9G 15G 17% /
tmpfs 250M 0 250M 0% /dev/shm
/dev/sda1 477M 46M 407M 11% /boot
/dev/sdb2 6.0G 93M 5.6G 2% /data
192.168.20.30:/home/ 18G 2.1G 15G 13% /root/nfs

ls -l 列出来共享的目录的文件所属主、组全部为nobody在nfs目录新建目录或文件提示权限被拒绝

[root@yong nfs]# ls -l
drwxr-xr-x 2 nobody nobody 4096 May 15 15:54 logs
drwx—— 3 nobody nobody 4096 May 11 14:47 mysql
drwx—— 4 nobody nobody 4096 May 13 14:24 php-fpm
drwx—— 2 nobody nobody 4096 May 22 11:40 test

[root@yong nfs]# mkdir abc
mkdir: cannot create directory `abc’: Permission denied
[root@yong nfs]# touch 1.txt
touch: cannot touch `1.txt’: Permission denied
服务器端/home目录新建111目录并设置权限为777客户端进入111目录下可以创建目录或文件创建的文件所属主、组都为nobodoy

[root@yong 111]# ls -l
-rw-r–r– 1 nobody nobody 0 May 22 13:40 1.txt
取消挂载重新挂载添加参数-o nolock,nfsvers=3 显示的所属主则为root进入111目录新建立文件文件所属主、组权限为501因为客户端已经存在501 对应账号为user1所以这里显示账号为user1

[root@yong ~]# umount /root/nfs/
[root@yong ~]# mount -t nfs -o nolock,nfsvers=3 192.168.20.30:/home/ /root/nfs/

[root@yong nfs]# ls -l
drwxrwxrwx 2 root root 4096 May 22 14:18 111
drwxr-xr-x 2 root root 4096 May 15 15:54 logs
drwx—— 3 500 testgroup 4096 May 11 14:47 mysql
drwx—— 4 user1 user1 4096 May 13 14:24 php-fpm
drwx—— 2 php-fpm php-fpm 4096 May 22 11:40 test
[root@yong nfs]# cd 111
[root@yong 111]# touch 2.txt
[root@yong 111]# ls -l
-rw-r–r– 1 user1 user1 0 May 22 2015 2.txt
[root@yong 111]# id -u user1
501

5、exportfs 命令的使用
-a 全部挂载或者卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享的目录
/home/ 192.168.20.0/24(rw,sync,no_root_squash) 不限制root用户客户端再创建的用户的所属主组都是root
可以进行更改权限删除文件。
改变/etc/exports配置文件后不用重启nfs服务执行命令#exportfs -arv 使/etc/exports配置文件生效
我们还可以把要挂载的nfs目录写到client上的/etc/fstab文件中 192.168.20.10:/tmp/ /test nfs nolock 0 0 然后 mount -a

实验测试服务器端更改nfs配置不压制root的权限

[root@localhost home]# cat /etc/exports
/home/ 192.168.20.0/24(rw,sync,no_root_squash)
[root@localhost home]# exportfs -arv
exporting 192.168.20.0/24:/home
客户端挂载nfs不指定nfsvers版本显示的账号还是为nobody但是可以直接创建文件已经有root权限

[root@yong ~]# mount -t nfs 192.168.20.30:/home/ /root/nfs/
[root@yong ~]# cd nfs/
[root@yong nfs]# touch 1.txt
[root@yong nfs]# ls -l
drwxrwxrwx 2 nobody nobody 4096 May 22 14:25 111
-rw-r–r– 1 nobody nobody 0 May 22 2015 1.txt
取消挂载nfs重新指定参数挂载挂载后显示账号为root

[root@yong ~]# umount /root/nfs/
[root@yong ~]# mount -t nfs -o nolock,nfsvers=3 192.168.20.30:/home/ /root/nfs/
[root@yong ~]# cd nfs/
[root@yong nfs]# touch 1.txt
[root@yong nfs]# ls -l
drwxrwxrwx 2 root root 4096 May 22 14:25 111
-rw-r–r– 1 root root 0 May 22 2015 1.txt

二、ftp
1、什么是ftp
FTP 是File Transfer Protocol文件传输协议的英文简称而中文简称为 “文传协议” 用于Internet上的控制文件的双向传输。
FTP的主要作用就是让用户连接上一个远程计算机这些计算机上运行着FTP服务器程序查看远程计算机有哪些文件然后把文件从远程计算机上拷到本地计算机或把本地计算机的文件送到远程计算机去。
在CentOS或者RedHat Linux上有自带的ftp软件叫做vsftpd。

2、使用pure-ftpd搭建FTP服务
pure-ftpd 官网 http://www.pureftpd.org/project/pure-ftpd
pure-ftpd 是服务端工具

先安装epel扩展源然后安装pure-ftpd包
#yum install -y epel-release
#yum install -y pure-ftpd
yum list 可以查看包所在的源

[root@pma ~]# yum list |grep pure-ftpd
pure-ftpd.i686 1.0.30-1.el6 epel
pure-ftpd-selinux.i686 1.0.30-1.el6 epel

pure-ftpd 配置模板参考

cat /etc/pure-ftpd/pure-ftpd.conf
ChrootEveryone yes
BrokenClientsCompatibility no
MaxClientsNumber 50
Daemonize yes
MaxClientsPerIP 8
VerboseLog no
DisplayDotFiles yes
AnonymousOnly no
NoAnonymous yes
SyslogFacility ftp
DontResolve yes
MaxIdleTime 15
PureDB /etc/pure-ftpd/pureftpd.pdb
LimitRecursion 3136 8
AnonymousCanCreateDirs no
MaxLoad 4
AntiWarez yes
Umask 133:022
MinUID 10
AllowUserFXP no
AllowAnonymousFXP no
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
AutoRename no
AnonymousCantUpload no
CustomerProof yes

生成随机字符串用户名长度为5没有特殊字符没有数字没有大写字母密码没有特殊字符然后重定向到一个文件中
如果没有mkpasswd命令需要安装expect包# yum install -y expect
user=`mkpasswd -l 5 -s 0 -d 0 -C 0`
pass=`mkpasswd -s 0`
echo $user $pass > /tmp/ftp.pass

[root@localhost ~]# cat /tmp/ftp.pass
zwdlc EEoz14swg
创建ftp服务的目录用于共享
#mkdir /data/ftp
#echo -e “$pass\n$pass”|pure-pw useradd $user -u test -d /data/ftp/
pure-pw 创建一个用户
-u test 映射一个用户系统里必须存在的用户。使用创建的随机用户映射到系统里的用户
pure-pw mkdb #创建密码文件把用户和密码保存到一个二进制的文件中。路径在/etc/pure-ftpd/pure-ftpd.conf配置文件里PureDB指定的路径中

[root@localhost ~]# ls -l /etc/pure-ftpd/pureftpd.pdb
-rw——- 1 root root 2141 5月 22 15:24 /etc/pure-ftpd/pureftpd.pdb
pure-pw list #列出用户

[root@localhost ~]# pure-pw list
zwdlc /data/ftp/./
pure-pw userdel $user #删除账号
/etc/init.d/pure-ftpd start #启动服务监听端口为21

ftp客户端需要安装lftp包#yum install -y lftp
输入命令 #lftp 用户名@ftp服务器ip地址
用户名为服务器创建的随机用户名ftp服务器ip地址输入密码就登录ftp服务器
put 文件 上传到ftp服务端
get 文件 下载到本地客户端目录

[root@yong nfs]# lftp zwdlc@192.168.20.30
Password:
lftp zwdlc@192.168.20.30:/> get nginx-1.6.2.tar.gz
804164 bytes transferred

2、vsftp配置ftp服务
服务端安装yum install -y vsftpd db4-utils
建立虚拟账号相关联的系统账号 useradd virftp -s /sbin/nologin
建立虚拟账户相关的文件 vim /etc/vsftpd/vsftpd_login //内容如下
test1
123456
test2
abcdef
chmod 600 /etc/vsftpd/vsftpd_login
生成对应的库文件 db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
db_load命令可以将用户文本信息文件转换为db数据库并使用hash加密。
选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的为了让Vsftpd这个应用程序能够通过文本来载入用户数据必须要使用这个选项。
指定了选项-T那么一定要追加子选项-t ; 子选项-t追加在在-T选项后用来指定转译载入的数据库类型。
hash就是使用hash码加密。
-f 参数后面接包含用户名和密码的文本文件文件的内容是:奇数行用户名、偶数行密码
如果更改密码更改文件后还需要db_load一下并重启ftp服务使其生效

建立虚拟账号相关的目录以及配置文件 mkdir /etc/vsftpd/vsftpd_user_conf
cd /etc/vsftpd/vsftpd_user_conf 创建和用户对应的配置文件
vim test1 内容如下

local_root=/home/virftp/test1
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=50000
mkdir /home/virftp/test1
修改权限 chown -R virftp:virftp /home/virftp

vim /etc/pam.d/vsftpd 用户认证的配置文件在最开头添加两行
auth sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login //如果是64位系统则改为/lib64/security/pam_userdb.so
account sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login //如果是64位系统则改为/lib64/security/pam_userdb.so
再修改vsftpd主配置文件
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES改为anonymous_enable=NO 匿名用户
#anon_upload_enable=YES 改为 anon_upload_enable=NO 匿名上传禁止
#anon_mkdir_write_enable=YES 改为 anon_mkdir_write_enable=NO 匿名创建目录禁止
再增加
chroot_local_user=YES
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf

启动vsftpd服务/etc/init.d/vsftpd start
启动vsftp服务报错vsftp.conf主配置文件guest_enable这一行错误的变量值。查找原因是因为这一行最后有空格所有配置文件末尾不能有空格删除空格后正常启动服务
[root@localhost vsftpd_user_conf]# /etc/init.d/vsftpd start
为 vsftpd 启动 vsftpd500 OOPS: bad bool value in config file for: guest_enable

客户端实验验证
ftp客户端需要安装lftp包yum install -y lftp
登录命令lftp test1@ftp服务端的ip地址

客户端访问ftp服务器故意输错密码竟然也能登录但是执行ls就提示登录失败使用正确口令登录使用ls正常

[root@localhost ~]# lftp
test1@192.168.22.30
口令:
lftp test1@192.168.22.30:~> ls
ls: 登录失败: 530 Login incorrect.
lftp test1@192.168.22.30:~> exit
[root@localhost ~]# lftp test1@192.168.22.30
口令:
lftp test1@192.168.22.30:~> ls
-rw-r–r– 1 0 0 0 May 24 15:21 1.txt
put上传一个文件ls查看文件的所属主、组为501在ftp服务器查看显示为virftp账号对应的uid即501

lftp test1@192.168.22.30:/> put 1.sql
1851 bytes transferred
lftp test1@192.168.22.30:/> ls -l
-rw-r–r– 1 501 501 1851 May 24 15:23 1.sql
-rw-r–r– 1 0 0 0 May 24 15:21 1.txt
[root@yonglinux test1]# ls -l
-rw-r–r– 1 virftp virftp 1851 5月 24 23:23 1.sql
-rw-r–r– 1 root root 0 5月 24 23:21 1.txt
[root@yonglinux ~]# tail -1 /etc/passwd
virftp:x:501:501::/home/virftp:/sbin/nologin

分类: Linux系统管理 标签:

nfs安装配置

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

nfs安装配置

Server:
1.改写配置文件

#vi /etc/exports
#写上你的公享的文件路径
#例如
#/home 192.168.0(rw) **注意:地址与权限中间没有空格
#让192.168.0网段可以访问 /home 并有 读写权限

2.启动服务

#service portmap start
#service nfs start

Client:

#挂载目录

#mount -t nfs ip地址:/home /mnt

CentOS 6安装portmap
晚上在看UNIX网络编程的RPC,程序执行需要用到portmap,发现CentOS 6上不叫portmap,而是改为rpcbind
01.yum install rpcbind 2. 开机启动关闭

01.chkconfig rpcbind off

NFS介绍
NFS = network file system
NFS只有三个系统守护进程:
rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器
rpc.mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过rpc.nfsd登录NFS服务后,在使用NFS服务所提供的,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
portmap:portmap的主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
nfs的端口是2049 ,但是它基于portmap,portmap的端口是111,所以默认策略是允许,禁止其中一个端口,都能禁止nfs服务器,而且nfs服务器自己的client描述功能已经很强大了。
相关文件:
1、/etc/exports
这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。现在的版本都有的,等会我们修改的也就是这个文件
2、/usr/sbin/exportfs
这是维护NFS共享资源的命令
3、/usr/sbin/showmount
shouwmount命令主要是用在client端,可以用来查看NFS共享出来的目录资源
4、/var/lib/nfs/*tab
其中的etab记录了NFS分享出来的目录的完整权限设定值,另一个是xtab,记录曾经连接到此NFS主机的相关client数据。

一、下载或从光盘上找到nfs服务安装包。

二、安装(nfs*代表其安装包名称):
# rpm -ivh nfs*

三、配置NFS文件:
现在我们来定义我们需要共享的文件和目录,用NFS共享的目录和文件是没有selinux限制的。
这个配置文件只要分为三列
第一列,写入你需要共享的目录路径
第二列 写入客户端描述,也就是哪些客户端可以使用你的服务器
第三列是紧挨着第二列的,内容是共享的权限
NFS对client的表达方式要求不是很严格,常用的表达方式他都能识别
比如:
IP就直接输入IP:192.168.0.24
网段:192.168.0.0/24 或 192.168.0.0/255.255.255.0
域名: www.linux.com
域:*.linux.com
如果表示所有的IP都能访问,就直接输入:*
而且你还可以分段表示,如下:
/mnt/dvd 192.168.2.0/24(ro,sync) 192.168.1.168(rw)
我们来配置一个例子试一下:
# vi /etc/exports
在里面加入如下内容:
/mnt/dvd 192.168.2.0/24(ro,sync)
保存并退出。
# exportfs -r
# service nfs restart
如果上面的命令都返回正常的话,就配置成功了。
# exportfs (此命令可以查看到本机用NFS共享的目录)
# showmount -e [NFS服务器IP] (它也可以查看到)
配置成功了之后,就可以挂载了。
挂载可以使用mount命令手动挂载,也可以使用autofs挂载
如果使用fstab挂载的话,要注意了,由于系统启动读取fstab在启动rc.d之前。所以那个时候nfs还没有启动,所以会挂载失败,可以在rc.local里面写入 mount -a 来在最后从新挂载fstab
我们先手动挂载试试
# mount -t nfs 192.168.2.11:/mnt/dvd /mnt/nfs
如果没有报错,就证明挂载成功了,也可以用mount命令来查看是否挂载成功
进去看看,是不是和我们/mnt/dvd目录下的东西一样

(卸载命令 umount /mnt/nfs)

然后我们在/mnt/nfs里面建立一个文件,看看权限是什么
看见没有,我明明是root写入的,怎么变成nfsnobody了呢?
NFS的共享权限和访问控制
关于刚才文件属于nfsnobody的原因,这个是由于系统默认的NFS共享权限中的root_squash导致的
root_squash:当登陆NFS主机使用共享目录的使用者是root时,其权限被转换成匿名使用者,通常它的UID与GID都会变成nobody身份。
其实NFS有很多默认的参数,我们可以去看看
大家看见了吗,默认就有sync,wdelay,hide等等
no_root_squash是让root保持权限,root_squash是把root映射成nobody。
no_all_squash 就不让所有用户保持在挂载目录中的权限
所以,root建立的文件是nfsnobody
sync:同步写入资料到内存与硬盘中
async:资料会暂存到内存中,而非直接写入硬盘
这两个那个比较好?
如果你是重要的小文件,当然是sync,同步写入,避免文件丢失
如果你是很大的数据,建议不要同步写入
rw:可读可写
ro:只读,这个很简单
注意:如果iptables开启了,nfs相关端口TCP和UDP都要开启,只开启一个的话是不行的!!
附:权限详细说明
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID

搭建NFS遇到的问题
1,在启动NFS服务器的时候遇到的一个问题如下,原因在于NFS配置文件中地址与权限中间多了一个空格,去掉空格重新启动即可:

[root@youxia121 local]# service nfs restart

关闭 NFS mountd:[确定]
关闭 NFS 守护进程:[确定]
关闭 NFS 服务: [确定]
启动 NFS 服务: exportfs: No options for /usr/local/data/ 192.168.0.122: suggest 192.168.0.122(sync) to avoid warning

exportfs: No host name given with /usr/local/data (rw,no_root_squash,no_all_squash,sync), suggest *(rw,no_root_squash,no_all_squash,sync) to avoid warning

[确定]

关掉 NFS 配额:[确定]
启动 NFS 守护进程:[确定]
启动 NFS mountd:[确定]

2,客户端在挂载的时候遇到的一个问题如下,可能是网络不太稳定,NFS默认是用UDP协议,换成TCP协议即可:
[root@youxia122 local]# mount -t nfs 192.168.0.121:/usr/local/data /usr/local/data
mount.nfs: Input/output error
解决方法:mount -t nfs 192.168.0.121:/usr/local/data /usr/local/data -o proto=tcp -o nolock

分类: Linux系统管理 标签:

CentOS 单网卡双IP配置和远程SSH

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

CentOS 单网卡双IP配置和远程SSH
http://blog.sina.com.cn/s/blog_69d179280101dq31.html
Linux
1、单网卡绑定多IP在Redhat系列中的实现方法
配置IP地址:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
里面的内容:
[root@localhost network-scripts]#vi /etc/sysconfig/
network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
配置完以后:
service network restart
修改DNS
[aeolus@db1 etc]$ vi resolv.conf
nameserver 202.96.128.68
nameserver 219.136.241.206
添加网通IP:
[root@localhost network-scripts]#vi /etc/sysconfig/
netwrok-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.0.3
NETMASK=255.255.255.0
其中的DEVICE为设备的名称,
IPADDR为此设备的IP地址,
BROADCAST是广播地址,
NETMASK为子网掩码
ONBOOT表示在系统启动时自动启动。
如果需要再绑定多一个IP地址,
只需要把文件名和文件内的DEVICE中的eth0:X加一即可。
配置远程SSH:
ssh的配置文件是/etc/ssh/ssh_config.
ee /etc/ssh/sshd_config
进入后修改
#PermitRootLogin no
为PermitRootLogin yes
注意:要去#
保存并退出
重启ssh
service ssh restart 重启远程服务
或者/etc/rc.d/sshd restart
查看磁盘 fdisk -l
/proc 硬件信息查询目录
挂载U盘:
建立目录 mkdir /aaa
挂载 mount /dev/sdb01/aaa
挂载光驱:mount -t is09660 /dev/cdrom /mnt/cdrom
卸载光驱:umount /dev/cdrom或者umount /mnt/cdrom

Centos环境下设置IP,网关以及DNS

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

Centos环境下设置IP,网关以及DNS
http://www.centoscn.com/CentOS/help/2013/0725/619.html

以下是我个人的一些学习笔记,仅供我个人使用。
设置系统的主机名:hostname linux.test(直接使用hostname可以显示当时系统的主机名)
启用eth0:ifconfig eth0 up(down)或ifup eht0
查看网络配置:ifconfig -a
设置IP地址:ifconfig eth0 192.168.1.45 netmask 255.255.255.0 up(up是表示立即激活)
重启网络设置:service network restart
查看当前路由信息:route
删除路由:route del -net 169.254.0.0 netmask 255.255.0.0
添加路由:route add -net 169.254.0.0 netmask 255.255.0.0 dev eth0
设置默认网关:route add default gw 192.168.1.1
设置DNS:echo “nameserver 211.98.1.28”>> /etc/resolv.conf
以下是网摘:
在Linux中不管你是做服务器还是只是平常使用,上网肯定都是最重要和不可缺少的一个因素之一,所以就涉及到它的ip gateway dns等network配置和使用。但是设置linux网络的方法有两种:

第一种:使用命令修改(直接即时生效,重启失效)
#ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
说明:
eth0是第一个网卡,其他依次为eth1,eth*
192.168.0.1是给网卡配置的第一个网卡配置的ip地址
netmask 255.255.255.0 配置的是子网掩码
up是表示立即激活

gateway
# route add default gw 192.168.30.1 eth0

dns:
# vi etc/resolv.conf
nameserver 202.131.80.1
nameserver 202.131.80.5

如果要重起生效,就把这些写到起动脚本 rc.local中

第二种:修改配置文档(需要重启网络配置,永远生效)

一、修改IP地址
/etc/sysconfig/network-scripts/ifcfg-eth0
[aeolus@db1 network-scripts]$ vi ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.30.197
NETMASK=255.255.255.0
GATEWAY=192.168.30.1

二、修改网关
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=Aaron
GATEWAY=192.168.30.1

三、修改DNS
[aeolus@db1 etc]$ vi resolv.conf
nameserver 202.131.80.1
nameserver 202.131.80.0
(一般现在这样设置以后都要重启network,所以还涉及到网络重启配置)

四、重新启动网络配
1:root账户下 # service network restart
2:# /etc/init.d/network restart
3:# ifdown eth0
# ifup eth0
4:# ifconfig eth0 down
# ifconfig eth0 up

五、启动和关闭防火墙
即时生效:
1:#service iptables start
#service iptables stop

重启系统生效:
2:#service iptables on
#service iptables off
当然ip gateway dns都是随你的网络改变而改变的

linux下设置固定IP的方法

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

linux下设置固定IP的方法
http://blog.163.com/liulina_517@126/blog/static/3766198320118231431594/
linux系统安装完,以后通过命令模式配置网卡IP。配置文件通常是/etc/sysconfig/network-scripts/ifcfg-interface-name

1.配置网卡IP地址

vi /etc/sysconfig/network-scripts/ifcfg-eth0 #第二块网卡:vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth0 #物理设备名
IPADDR=192.168.1.10 #IP地址
NETMASK=255.255.255.0 #掩码值
NETWORK=192.168.1.0 #网络地址(可不要)
BROADCAST=192.168.1.255 #广播地址(可不要)
GATEWAY=192.168.1.1 #网关地址
ONBOOT=yes # [yes|no](引导时是否激活设备)
USERCTL=no #[yes|no](非root用户是否可以控制该设备)
BOOTPROTO=static #[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)

2.配置网卡DNS

配置文件在/etc/resolv.conf下面。

vi /etc/resolv.conf

nameserver 202.109.14.5 #主DNS

nameserver 219.141.136.10 #次DNS

search localdomain

所以网络配置完成后,都需要重启网络服务:service network restart 或/etc/init.d/network restart

3.单网卡绑定两个IP

linux的网络设备配置文件存放在/etc/sysconfig/network-scripts里面, 对于以太网的第一个网络设备,配置文件名一般为ifcfg-eth0。如果需要为第一个网络设备多绑定一个IP地址,只需要在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,内容样例为:

DEVICE=”eth0:0″
IPADDR=”211.100.10.119″
NETMASK=”255.255.255.0″
ONBOOT=”yes”

其中的DEVICE为设备的名称,IPADDR为此设备的IP地址,NETMASK为子网掩码,ONBOOT 表示在系统启动时自动启动。
如果需要再绑定多一个IP地址,只需要把文件名和文件内的DEVICE中的eth0加一即可。LINUX最多可以支持255个IP别名。

分类: Linux系统管理 标签:

Socket连接出现大量的FIN_WAIT_2状态

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

Socket连接出现大量的FIN_WAIT_2状态
http://blog.csdn.net/xiaofei0859/article/details/6050806
笔者完成的Socket Server端控件,经常在使用几个月后出现大量的FIN_WAIT_2状态的端口不能释放,造成服务器不能在有端口资源供给客户端建立新的连接,这一现象只出现在对方是UNIX的用户(移动的BOSS系统),笔者自己开发的Socket客户端控件从来没有出现过这个现象。
经过研究Socket的状态图

得出结论是Server端强制断开Socket时向客户端发送了FIN请求,客户端已经没有能力继续回复ACK,造成了服务器端大量的端口处在FIN_WAIT_2状态,不能释放。
解决的方法:
在服务器端控件的close Socket函数中增加调用Shutdown函数,强制Socket释放。
MFC中的CSyncScoket类中的Shutdown函数的功能是禁止收、发或者收发都禁用。
参数的含义是:
•receives = 0
•sends = 1
•both = 2
笔者选择2。
close有两个限制可由函数shutdown来避免:
close将描述字的访问计数减1,仅在此计数为0时才关闭套接口
shutdown可激发TCP的正常连接终止序列, 而不管访问计数。

作为一名Wi n s o c k程序员,通常没必要了解实际的T C P状态。但了解T C P状态,就能更好地理解Winsock API调用如何对基层协议中的改变产生影响。此外,许多程序员在关闭套接字时,会碰到一个常见问题;围绕套接字关闭的T C P状态是我们目前最感兴趣的问题。
对每个套接字来说,它的初始状态都是C L O S E D。若客户机初始化了一个连接,就会向服务器发送一个S Y N包,同时将客户机套接字状态置为S Y N _ S E N T。服务器收到S Y N包后,会发出一个“ S Y N – A C K”包。作为客户机,需要用一个A C K包对它做出反应。此时,客户机的套接字会变成E S TA B L I S H E D状态。如果服务器一直不发送“ S Y N – A C K”包,客户机就会超时,并返回C L O S E D状态。
若一个服务器的套接字同一个本地接口和端口绑定起来,并在它上面进行监听,那么套接字的状态便是L I S T E N。客户机试图与之连接时,服务器就会收到一个S Y N包,并用一个S Y N – A C K包做出响应。服务器套接字的状态就变成S Y N _ R C V D。最后,客户机发出一个A C K包,令服务器套接字的状态变成E S TA B L I S H E D。
一旦应用处于E S TA B L I S H E D状态,可通过两种方法来关闭它。如果由应用程序来关闭,便叫作“主动套接字关闭”;否则,套接字的关闭便是被动的。图7 – 2对两种关闭方法进行了解释。如主动关闭,应用程序便会发出一个F I N包。应用程序调用c l o s e s o c k e t或s h u t d o w n时(把S D _ S E N D当作第二个参数),会向对方发出一个F I N包,而且套接字的状态则变成F I N _ WA I T _ 1。正常情况下,通信对方会回应一个A C K包,我们的套接字的状态
随之变成F I N _ WA I T _ 2。如对方也关闭了连接,便会发出一个F I N包,我们的机器则会响应一个A C K包,并将己方套接字的状态置为T I M E _ WA I T。
T I M E _ WA I T状态也叫作2 M S L等待状态。其中, M S L代表“分段最长生存时间”(Maximum Segment Lifetime),表示一个数据包在丢弃之前,可在网络上存在多长时间。
每个I P包都含有一个“生存时间”(T T L)字段,若它递减为0,包便会被丢弃。一个包经过网络上的每个路由器时, T T L 值都会减1 ,然后继续传递。一旦应用程序进入T I M E _ WA I T状态,那么就会一直持续M S L时间的两倍之久。这样一来, T C P就可以在最后一个A C K丢失的前提下,重新发送它,也就是说, F I N会被重新传送出去。M S L时间两倍之久的等待状态结束之后,套接字便进入C L O S E D状态。
图7-2 TCP套接字的关闭状态
套接字主动关闭
关闭套接字
发送: FIN—–>FIN_WAIT_1–接收:ACK–>FIN_WAIT_2—-接收: FIN发送: ACK—>TIME_WAIT(2MSL超时)—–>CLOSED
套接字主动关闭
关闭套接字
发送: FIN—–>接收: FIN发送: ACK—->CLOSING–接收: ACK–>TIME_WAIT(2MSL超时)—–>CLOSED
套接字主动关闭
关闭套接字
发送: FIN—–>接收: FIN_ACK发送: ACK—–>TIME_WAIT(2MSL超时)—–>CLOSED
套接字被动关闭
接收: FIN
发送: ACK——>CLOSE_WAIT–关闭套接字发送: FIN–>LAST_ACK——->CLOSED
T I M E _ WA I T状态也叫作2 M S L等待状态。其中, M S L代表“分段最长生存时间”(Maximum Segment Lifetime),表示一个数据包在丢弃之前,可在网络上存在多长时间。
每个I P包都含有一个“生存时间”(T T L)字段,若它递减为0,包便会被丢弃。一个包经过网络上的每个路由器时, T T L 值都会减1 ,然后继续传递。一旦应用程序进入T I M E _ WA I T状态,那么就会一直持续M S L时间的两倍之久。这样一来, T C P就可以在最后一个A C K丢失的前提下,重新发送它,也就是说, F I N会被重新传送出去。M S L时间两倍之久的等待状态结束之后,套接字便进入C L O S E D状态
采取主动关闭措施时,有两个路径会进入T I M E _ WA I T状态。在我们以前的讨论中,
只有一方发出一个F I N,并接收一个A C K响应。然而,另一方仍然可以自由地发送数据,
直到它也被关闭为止。因此,需要两个路径发挥作用。在一个路径中(即同步关闭),一台计算机和它的通信对方会同时要求关闭;计算机向对方送出一个F I N数据包,并从它那里接收一个F I N数据包。随后,计算机会发出一个A C K数据包,对对方的F I N包做出响应,并将自己的套接字置为C L O S I N G状态。计算机从对方那里接收到最后一个A C K包之后,它的套接字状态会变成T I M E _ WA I T。
主动关闭时,另一个路径其实就是同步关闭的变体:套接字从F I N _ WA I T _ 1状态直接变成T I M E _ WA I T。若应用程序发出一个F I N数据包,但几乎同时便从对方那里接收到一个F I N – A C K包,这种情况就会发生。在这种情况下,对方会确认收到应用程序的F I N包,并送出自己的F I N包。对于这个包,应用程序会用一个A C K包做出响应。
T I M E _ WA I T状态的主要作用是在T C P连接处于2 M S L等待状态的时候,规定用于建立那个连接的一对套接字不可被拒绝。这对套接字由本地I P端口以及远程I P端口组成。对某些T C P实施方案来说,它们不允许拒绝处于T I M E _ WA I T状态下的套接字对中的任何端口号。在微软的方案中,不会存在这个问题。然而,若试图通过一对已处于T I M E _ WA I T状态的套接字建立连接,就会失败,并返回W S A E A D D R I N U S E错误。要解决这一问题(除了等待使用那个本地端口来脱离T I M E _ WA I T状态的套接字对),一个办法是使用套接字选
项S O _ R E F U S E A D D R,我们将在第9章对这个选项进行详细讨论。
被动关闭情况下,应用程序会从对方那里接收一个F I N包,并用一个A C K包做出响应。此时,应用程序的套接字会变成C L O S E _ WA I T状态。由于对方已关闭自己的套接字,所以不能再发送数据了。但应用程序却不同,它能一直发送数据,直到对方的套接字已关闭为止。要想关闭对方的连接,应用程序需要发出自己的F I N,令应用程序的套接字状态变成L A S T _ A C K。应用程序从对方收到一个A C K包后,它的套接字就会逆转成C L O S E D状态。
要想了解T C P / I P协议的有关详情,请参阅RFC 793 文件。可在h t t p : / / w w w. r f c -e d i t o r. o rg那里找到这份文件。

分类: Linux系统管理 标签:

学会理解并编辑fstab

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

学会理解并编辑fstab

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

可能玩Linux的朋友都知道fstab这个文件,如果要用好linux,熟悉linux的一些核心配置文件是必要的,而fstab则是其中之一。这个文件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。因此,我们需要理解其中的内容,了解它如何与 mount命令配合工作,并能够针对自己的情况进行修改。

作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分区和存储设备的信息,以及它们应该挂载到哪里,以什么样子的方式挂载。如果遇到一些类似于无法挂载你的windows分区阿,无法使用你的光驱阿,无法对某个分区进行写入操作阿什么的,那么基本上可以断定,你的fstab内容有问题了。也就是说,你可以通过修改它来搞定这些问题,而不用去论坛冰天雪地裸体跪求答案了。

说了半天,/etc/fstab其实就是一个文本文件,用gedit或者vi都可以打开,当然,前提是root权限。在这个文件中,每个文件系统(包括分区或者设备)用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为 fsck,mount或umount等程序在做它们的工作时会按此顺序进行本。下面进行详细的讲解,本文假设读者已经有挂载文件系统和分区的基础知识。

在讲解之前要说一下,每个人所使用的系统情况都是不同的,包括硬件种类,所用系统等,因此fstab文件肯定是有所差异的。但是其基本结构,如上所述,都不会变。所以我们先以一个fstab内容作为模板进行讲解。

首先请看下面这个例子:
/dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2
/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0
/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0
proc /proc proc defaults 0 0
/dev/hda1 swap swap pri=42 0 0

这些看起来毫无意义的字符代表了什么?在对应相应分区或者存储设备信息的每一行中,每一列又是什么意思?先大体讲一下,第一列表示设备的名称,第二列表示该设备的挂载点,第三列是文件系统,第四列是挂载选项,第五列是dump选项(用一个数字表示),第六列(接下来的数字)表示文件系统检查选项。好了,接下来,就要详细介绍这些参数的具体含义了。

第一、二列:设备和默认挂载点

说实话,第一列和第二列的内容是最简单最直接的,它们的作用就是告诉mount命令,我想挂载什么分区或者什么设备,以及我所希望的挂载点在哪里。在fstab中为某一个设备指定的挂载点是其默认挂载点,也就是当你在挂载目录的时候没有手工指定其他目录的话,系统就将该设备挂载到这个目录。大多数 Linux发行版都会为挂载点创建专门的目录,大多数是在/mnt下,但是一些发行版(比如SUSE或者ubuntu)是在/media下。笔者使用的是 ubuntu,所以示例信息中也是用的/media目录。

按照我们给出的fstab示例,如果你敲入命令

$ mount /dev/fd0

你的软驱就将挂载到/media/floppy,因为这是你告诉系统的软驱默认挂载点。如果没有这个信息,当你敲入mount命令时,mount会感到很困惑:该死的,你想让我把这玩意挂载到哪里去呢?当然,如果你看fstab中发行版给你指定的默认挂载点不顺眼,也可以自由修改它,修改成任何一个你希望的目录都可以。如果还不存在,就首先创建这个目录。要知道,fstab是不会把所有工作都给你包干的哦。

另外,有一些分区和存储设备是在Linux系统启动的时候就自动挂载的,比如,让我们看看刚才列出来的fstab示例信息,有两行是这样的:
/dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2

正如刚才我们讲到的那样,这两行表示/dev/hda2默认挂载到/根目录,而 /dev/hdb1则默认挂载到/home目录,。这些工作在你Linux系统启动的时候就会通过读取fstab自动完成,否则的话……想象你会遭受什么样的折磨吧,所有的程序都在/根目录下,而你却无法使用,因为你没有挂载/根目录!恩,我保证,这将是一次让人沮丧的系统使用经历。

除了显示的使用设备名,你可以使用设备的UUID或设备的卷标签,例如,你可以在这个字段写成“LABAL=root”或“UUID= 3e6be9de- 8139-11d1-9106-a43f08d823a6”,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个SCSI硬盘,这有可以改变你的设备名,但它不会修改你的卷标签。

对于NFS mount操作,这个字段应该包含host:dir格式的信息,例如:knuth.aeb.nl:/,对于进程文件系统procfs,使用proc。

第三列:文件系统类型

fstab中的第三列指示了设备或者分区的文件系统类型。它支持很多种类的文件系统,我们在这里只介绍最为常用的。如果想了解你的kernel目前支持哪些文件系统,可以查看/proc/filesystems的内容。如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。

ext2 和 ext3: Linux下的Ext2文件系统,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。日志式文件系统的优越性在于,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回朔追踪。由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回朔并重整被中断的部分,而不必花时间去检查其他的部分,故文件系统检测不一致时,重整的工作速度相当快,几乎不需要花时间。

reiserfs: ReiserFS是一个非常优秀的文件系统。也是最早用于Linux的日志文件系统之一,其机制比Ext3要先进得多,风雷小弟一直使用的就是它,很多发行版现在也把它作为默认文件系统了。可惜其作者前段时间出事了……具体情况就不说了,也不知道下一代reiserfs4还能不能出来,因为ext4都有了。

swap: Swap,即交换区,把它想象成虚拟内存就行了。

vfat 和 ntfs:一看就知道是Windows分区格式了,呵呵。98,me等系统都是使用的vfat,也就是最流行的fat32格式,而NT系列则多使用NTFS,当然也不是固定的,因此2000或者XP系统要具体情况具体分析。当初Linux对NTFS的写入支持不好,所以大多数资料都建议用户使用vfat格式,但是现在支持已经很好了,即使不重新编译内核,也可以通过ntfs-3g来进行写入支持(具体方法请参考这篇文章),因此不用太在意这个了。

auto:当然,这不是一个文件系统类型。auto只是表示,文件系统的类型将被自动检测。在上面的示例中,你会发现软驱和光驱的文件系统类型都是auto,为什么呢?因为它们的文件系统类型随时都可能改变,比如软驱,优盘这种设备,可能今天是vfat格式,明天你就把它格式化成了ntfs,因此,最明智的做法就是告诉系统,我没法确定这东西的当前类型,还是你自己检测吧。

udf: 由于刻录光驱越来越流行,现在很多发行版自带的fstab中,光驱的文件格式类型是UDF,UDF是Universal Disc Format的缩写,与ISO 9660格式相容。它采用标准的封装写入技术(PW,Packet Writing)将CD-R/CD-RW当作硬盘使用,用户可以在光盘上修改和删除文件。利用UDF格式进行刻录时,刻录软件将数据打包,并在内存中临时建立一个特殊文件目录表,同时接管系统对光盘的访问。

iso9660: 很多光驱也使用的这个选项。ISO9660是一种描述适合CD盘片的电脑文件结构的国际标准。采用此标准的盘片可以在不同的操作系统上使用,如MAC和Windows。

第四列:挂载选项

fstab中的第四列表示设备或者分区所需要的挂载选项。这一列也是fstab中最复杂最容易出错的一列,当然,只要你能知道一些最常用的选项是什么意思,就可以让你从头疼中解脱出来。如果要把可用的选项一项一项介绍……恩,我估计我会写到明天,所以,我还是只是分析最常用的一些选项,如果你想知道更多的东西,还是求助于man吧。

auto 和 noauto: 这是控制设备是否自动挂载的选项。auto是默认选择的选项,这样,设备会在启动或者你使用mount -a命令时按照fstab的内容自动挂载。如果你不希望这样,就使用noauto选项,如果这样的话,你就只能明确地通过手工来挂载设备。

user 和 nouser:这是一个非常有用的选项,user选项允许普通用户也能挂载设备,而nouser则只允许root用户挂载。nouser是默认选项,这也是让很多 Linux新手头疼的东西,因为他们发现没有办法正常挂载光驱,Windows分区等。如果你作为普通身份用户遇到类似问题,或者别的其他问题,就请把 user属性增加到fstab中。

exec 和 noexec: exec允许你执行对应分区中的可执行二进制程序,同理,noexec的作用刚好相反。如果你拥有一个分区,分区上有一些可执行程序,而恰好你又不愿意,或者不能在你的系统中执行他们,就可以使用noexec属性。这种情况多发生于挂载Windows分区时。exec是默认选项,理由很简单,如果 noexec变成了你/根分区的默认选项的话……

ro: 以只读来挂载文件系统。

rw: 以可读可写的属性来挂载系统。

sync 和 async:对于该文件系统的输入输出应该以什么方式完成。sync的意思就是同步完成,通俗点讲,就是当你拷贝一个东西到设备或者分区中时,所有的写入变化将在你输入cp命令后立即生效,这个东西应该立马就开始往设备或者分区里面拷贝了。而如果是async,也就是输入输出异步完成的话,当你拷贝一个东西到设备或者分区中时,可能在你敲击cp命令后很久,实际的写入操作才会执行,换句话说,就是进行了缓冲处理。

有时候这种机制蛮不错的,因为sync会影响你系统的运行速度,但是这也会带来一些问题。想一想,当你希望将一个文件拷贝到u盘上时,你执行了cp 命令,却忘记执行umount命令(它会强行将缓冲区内容写入),那么你拷贝的文件实际上并没有在u盘上面。如果你是使用的mv命令,而你又很快将u盘拔出……恭喜你,文件会从这个星球上消失的。因此,虽然async是默认属性,但是对于u盘,移动硬盘这种可移动存储设备,最好还是让他们使用sync选项。

defaults: 所有选项全部使用默认配置,包括rw, suid, dev, exec, auto, nouser, 和 async。

一般用户没有特殊需求,直接使用defaults就可以了。看完介绍,我们再回过头去看看前面的示例内容,以光驱为例,主要关注挂载选项这里,可以看到,光驱和其他分区设备的不同是ro,因为普通光驱是只读的。而exec则让你可以从光驱上直接执行某些程序。

第五、六列:dump和fsck选项

Dump和fsck?这是什么东西?恩,dump是一个备份工具,而fsck是一个文件系统扫描检查工具。我不会在这里详细介绍它们,因为用man或者google都可以获得更加详细的信息。

fstab的第五列是表示dump选项,dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0,dump就会被忽略,事实上,大多数的dump设置都是0。而第六列是fsck选项,fsck命令通过检测该字段来决定文件系统通过什么顺序来扫描检查,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若文件系统无需在启动时扫描检查,则设置该字段为0。

分类: Linux系统管理 标签:

mac环境 laravel: command not found问题解决方案

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

mac环境 laravel: command not found问题解决方案
http://blog.csdn.net/customicondesign/article/details/44153045
<span style=”font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);”>今天开始学习laravel,laravel用composer 安装,在终端输入laravel new blog(project name)得时候,出现了以下问题laravel: command not found</span>
查看技术文档这么Make sure to place the ~/.composer/vendor/bin directory in your PATH so the laravel executable can be located by your system. 应当是要让~/.composer/vendor/bin/laravel在mac的环境变量里面。在网上查看资料发现了有以下解决方案:
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
export PATH=”~/.composer/vendor/bin:$PATH”

尽管可行,但是当终端关闭之后,就不行了。也就是每次创建项目的时候都必须要输入一次。那种只是临时的解决方案。

还有就是
[plain] view plaincopy在CODE上查看代码片派生到我的代码片
nano ~/.bashrc
输入:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
alias laravel=’~/.composer/vendor/bin/laravel’
保存然后在终端输入:
source ~/.bashrc
关闭终端输入laravel new blog
可行。
问题解决。

至于为什么这么解决,自己想去!!!

分类: Linux系统管理 标签:

linux下如何设置环境变量PATH

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

linux下如何设置环境变量PATH
http://blog.csdn.net/witsmakemen/article/details/7831631
Ubuntu Linux 环境变量PATH设置
0人收藏此文章,收藏此文章 发表于2小时前 , 已有2次阅读 共0个评论0人收藏此文章
Ubuntu Linux系统环境变量配置文件:
/etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。

/etc /environment : 在登录时操作系统使用的第二个文件, 系统在读取你自己的profile前,设置环境文件的环境变量。

~/.profile : 在登录时用到的第三个文件 是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

/etc/bashrc : 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

~/.bashrc : 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

PASH环境变量的设置方法:

方法一:用户主目录下的.profile或.bashrc文件(推荐)

登录到你的用户(非root),在终端输入:
$ sudo gedit ~/.profile(or .bashrc)
可以在此文件末尾加入PATH的设置如下:
export PATH=”$PATH:your path1:your path2 …”
保存文件,注销再登录,变量生效。
该方式添加的变量只对当前用户有效。

方法二:系统目录下的profile文件(谨慎)

在系统的etc目录下,有一个profile文件,编辑该文件:
$ sudo gedit /etc/profile
在最后加入PATH的设置如下:
export PATH=”$PATH:your path1:your path2 …”
该文件编辑保存后,重启系统,变量生效。
该方式添加的变量对所有的用户都有效。

方法三:系统目录下的 environment 文件(谨慎)

在系统的etc目录下,有一个environment文件,编辑该文件:
$ sudo gedit /etc/environment
找到以下的 PATH 变量:
PATH=”<……>”
修改该 PATH 变量,在其中加入自己的path即可,例如:
PATH=”<……>:your path1:your path2 …”
各个path之间用冒号分割。该文件也是重启生效,影响所有用户。
注意这里不是添加export PATH=… 。

方法四:直接在终端下输入

$ sudo export PATH=”$PATH:your path1:your path2 …”
这种方式变量立即生效,但用户注销或系统重启后设置变成无效,适合临时变量的设置。
注 意:方法二和三的修改需要谨慎,尤其是通过root用户修改,如果修改错误,将可能导致一些严重的系统错误。因此笔者推荐使用第一种方法。另外嵌入式 Linux的开发最好不要在root下进行(除非你对Linux已经非常熟悉了!!),以免因为操作不当导致系统严重错误。

下面是一个对environment文件错误修改导致的问题以及解决方法示例:

问题:因为不小心在 etc/environment里设在环境变量导致无法登录
提示:不要在 etc/environment里设置 export PATH这样会导致重启后登录不了系统
解决方法:
在登录界面 alt +ctrl+f1进入命令模式,如果不是root用户需要键入(root用户就不许这么罗嗦,gedit编辑会不可显示)
/usr/bin/sudo /usr/bin/vi /etc/environment
光标移到export PATH** 行,连续按 d两次删除该行;
输入:wq保存退出;
然后键入/sbin/reboot重启系统(可能会提示need to boot,此时直接power off)

分类: Linux系统管理 标签: