关于作者

用户名:BlueSilence
笔名:BlueSilence
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



linux

访问统计:
文章个数:49
评论个数:57
留言条数:40




Powered by BlogDriver 2.1

BlueSilence的博客

 

祝自己生日快乐 ^_^

文章

samba学习笔记
什么是samba? linux与windows局域网共享的桥梁,一起来跳samba吧 ^_^

安装samba-3.0.13:

下载:
ftp://ftp.samba.org/pub/samba/samba-3.0.13.tar.gz

解压:
[root@LFS ~]#tar zxvf samba-3.0.13.tar.gz
编译:
[root@LFS ~]#cd samba-3.0.13/source
[root@LFS source]#install -d /var/cache/samba/
[root@LFS source]#./configure --prefix=/usr/local/samba --localstatedir=/var \
--with-piddir=/var/run --with-smbmount && make
samba可以支持许多东东,例如quota,pam,automount. 使用./configure --help查看相关内容

安装:
[root@LFS source]#make install
[root@LFS source]#mv /usr/local/samba/lib/libsmbclient.so /usr/lib
[root@LFS source]#ln -s /usr/lib/libsmbclient.so /usr/local/samba/lib
[root@LFS source]#install -m755 nsswitch/libnss_win{s,bind}.so /lib
[root@LFS source]#ln -sf libnss_winbind.so /lib/libnss_winbind.so.2
[root@LFS source]#ln -sf libnss_wins.so /lib/libnss_wins.so.2
[root@LFS source]#cp ../examples/smb.conf.default /usr/local/samba/lib/smb.conf

配置:

编辑samba配置文件/usr/local/samba/lib/smb.conf:
[global]......[homes]之间为全局设定. [homes]以下的为共享目录设定

全局设定:
[global]
   workgroup = WORKGROUP      #工作组或NT域名
   NetBIOS Name   = blue-lfs  #本机器的NetBIOS名称
   server string = LFS Samba Server #描述服务器信息
   unix charset  =  gb2312     #使中文目录正常显示
   dos charset=cp936            #同上,在Linux的X终端中正常显示中文名
   security = user       #samba验证密码方式,user:需要密码,share:不需要密码

   hosts allow = 172.16.245.  127. #允许的主机ip
   guest account = nobody    #guest帐号,结合以下两项,没有通过密码验证的机器会以nobody
   map to  guest = Bad User   #访问samba服务器中的公开资源。
   map to  guest = Bad Password

   log file = /var/log/samba/log.%m samba日志存放位置, %m表示以连接机器的netBIOS名称记录
   max log size = 0        #日志最大长度 (KB) 0表示无限制
  ;encrypt passwords = yes  #是否使用加密密码,user级别使用(samba-3.0.13)不需要设定
   smb passwd file  = /usr/local/samba/smbpasswd #密码存放文件
  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 #提高性能
  interfaces = 10.70.54.0/24  172.16.245.0/24 172.16.249.0/24
  #如果有多个网络接口,必须全部列出来,否则可能会出错
   dns proxy = no    #不通过dns解析 netBIOS 名称

共享目录设定:  
当使用者以不同帐号登陆samba服务器时,homes会变成相应的家目录(samba根据/etc/passwd决定帐号家目录)
[homes]
   comment = Home Directories  #目录描述信息
   browseable = no    #防止用户浏览其他用户的家目录
   writable = yes     #允许写入,同时需要samba服务器该用户有写入权限

   ;valid user = %S   #可以使用该目录的帐号,%S表示任何在smbpasswd中记录的
   ;create mode = 0644 #创建文件的权限
   ;directory mode = 755 #创建目录的权限

[software]   #使用者看到的共享目录名称
     comment     =  LFS software
     path        =  /software  #共享目录的路径
     public      =  no  # 非公开的,需要合法帐号登陆
     valid user  =  blue root  #允许登陆的帐号
     readonly    =  no  # 允许写入
     writable    =  yes  #如果这里为no,则不可以写入. 最后出现的设定值有效
[public]
     comment     = public file
     path        =  /tmp 
     public      = yes
     writable    = no
     guest ok    = yes   #允许guest帐号访问

建立使用者帐号密码:
samba中的帐号必须真实存在于/etc/passwd中,建立它:
[root@LFS ~]#useradd -c "samba user" -s /bin/false blue
加入到smbpasswd中:
[root@LFS ~]#cd /usr/local/samba
[root@LFS samba]#touch smbpasswd
[root@LFS samba]#chown root:root smbpasswd
[root@LFS samba]#chmod 700 smbpasswd
[root@LFS samba]#smbpasswd -a blue
New SMB password:
Retype new SMB password:
Added user blue.
[root@LFS samba]#cat smbpasswd
blue:501:87F33EC80F6BE805AAD3B435B51404EE:D33DD5DE3AB41AB1E509E8FFBA234FA5:[U          ]:LCT-424FAC42:
[root@LFS samba]#
smbpasswd :  smbpasswd -[ademx]  username
-a 新增一个使用者
-d 禁止一个使用者,会在smbpasswd中多出个"D"
-e 恢复使用者
-m 该username 为机器代码,使用samba做为PDC主机时使用
-x 从smbpasswd中删除使用者

测试:
使用testparm可以测试smb.conf语法是否有错误以及查看设定值:
[root@LFS ~]#testparm
Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[homes]"
Processing section "[software]"
Processing section "[public]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
......略
[root@LFS ~]#

启动samba :

samba需要启动两个daemon:nmbd,smbd :
nmbd :用来管理群组,NetBIOS name 解析
smbd : 用来管理samba主机共享的目录,文件以及打印机

启动它们:(发行版中有自己的samba服务脚本,启动其脚本即可:service smb start)
[root@LFS ~]#/usr/local/samba/sbin/nmbd -D
[root@LFS ~]#/usr/local/samba/sbin/smbd -D

可以看到137-139端口已经处以监听状态:
[root@LFS ~]#netstat -tunl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6000            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN
udp        0      0 10.70.54.31:137         0.0.0.0:*
udp        0      0 172.16.245.1:137        0.0.0.0:*
udp        0      0 172.16.249.1:137        0.0.0.0:*
udp        0      0 0.0.0.0:137             0.0.0.0:*
udp        0      0 10.70.54.31:138         0.0.0.0:*
udp        0      0 172.16.245.1:138        0.0.0.0:*
udp        0      0 172.16.249.1:138        0.0.0.0:*
udp        0      0 0.0.0.0:138             0.0.0.0:*
[root@LFS ~]#

Client端测试下:
[root@LFS ~]#smbclient -L \\blue-lfs -U blue
Password:
Domain=[BLUE-LFS] OS=[Unix] Server=[Samba 3.0.13]

        Sharename       Type      Comment
        ---------       ----      ---------     
        software      Disk      software
        public          Disk      public file
        IPC$            IPC       IPC Service (LFS Samba Server)
        ADMIN$          IPC       IPC Service (LFS Samba Server)
        blue            Disk      Home Directories
Domain=[BLUE-LFS] OS=[Unix] Server=[Samba 3.0.13]

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        WORKGROUP-LFS
[root@LFS ~]# 

常用变量:
%m :Client的NetBIOS名称 %M : client的HostName  %L :samba server的NetBIOS名称
%h :samba server的HostName %H : 使用者的家目录  %g :使用者的群组名
%U :使用者名称   %I Client的IP   %T 当前时间


Samba做PDC(Primary Domain Controller 主域控制器):

设定smb.conf,将以下几行注释去掉:(其余设定同上)
[global]
   local master = yes
   os level = 64   #与网域内其他主机相比,这台主机的级别
   domain master = yes
   preferred master = yes
   domain logons = yes
   ;logon script = %U.bat
 #使用者登陆后会执行自己帐号的.bat批处理.该批处理文件存放在[netlogon]
   logon script = startup.bat
#我这里设定所有登陆者均使用相同配置,执行startup.bat
   logon path = \\%L\Profiles\%U
# 漫游配置文件存放位置,Profiles将被[Profiles]中的路径取代
   wins support = yes
 
[netlogon] 
   comment = Network Logon Service 
   path  = /home/samba/netlogon
   guest ok = yes
   writable = no 
   write list =blue root  #可以写入的用户,其余用户无法写入
   share modes = no

[Profiles]
    path = /home/samba/profiles
    browseable = no #不可浏览,实际上仍然可以使用该目录,与windows中的c$的"$"作用类似
    guest ok = yes
    readonly = no  #必须设定,否则windows注销时无法将漫游配置文件传回服务器

创建各个目录:
[root@LFS ~]#mkdir -p /home/samba/profiles
[root@LFS ~]#mkdir  /home/samba/netlogon
编写startup.bat :
[root@LFS ~]#cd /home/samba/netlogon
[root@LFS ~]#vi startup.bat
net time   \\blue-lfs /set /yes   #同步client与server时间
net use T:  \\blue-lfs\software   #software目录映射成T盘   
net use X:  \\blue-lfs\public     #public目录映射成X盘

net是windows中的指令,net use 语法:
net use [device:] [directory]

该批处理文件必须是dos格式才可以,即必须以 ^M$换行
[root@LFS ~]#cat -A /home/samba/netlogon/startup.bat
net time   \\blue-lfs /set /yes ^M$
net use T:  \\blue-lfs\software ^M$
net use X:  \\blue-lfs\public ^M$
[root@LFS ~]#
使用vi可通过 :set textmode 达到要求,或使用tr转换字符:
[root@LFS ~]#cat -A startup.bat |tr '$' '\r' >startup.bat

再将漫游用户的配置文件(C:\Documents and Settings\username)
放到samba server的/home/samba/profile/下

做为PDC内的机器需要提供给PDC其机器代码:
[root@LFS ~]#groupadd machine
[root@LFS ~]#useradd -g machine -s /bin/false -d /dev/null blue2000$
blue2000为我的windows 2000的NetBIOS名称,后加上'$'表示为机器代码
如果useradd不允许添加带有'$'的帐号,则可添加blue2000,再修改/etc/passwd /etc/shadow
[root@LFS ~]#smbpasswd -a -m blue2000$

win2k第一次登陆PDC需要使用root帐号,添加它,不要samba密码与linux主机相同 :)
[root@LFS ~]#smbpasswd -a root

Client端设定 :
首先Client上必须已安装" Microsoft 网络的文件和打印机共享"
win2000: 开始-->控制面板-->网络和拨号连接-->高级-->网络标识-->属性
修改主机名为blue2000及加入工作组WORKGROUP.重启
网络标识--->网络ID 按照提示进行,设置后重启即可选择域登陆

Linux中访问samba服务器共享目录:
使用smbclient :
[root@LFS ~]#smbclient -U blue //blue-lfs/blue
Password:
Domain=[WORKGROUP-LFS] OS=[Unix] Server=[Samba 3.0.13]
smb: \> ls
  .                                   D        0  Tue Mar 29 00:31:13 2005
  ..                                  D        0  Sat Apr  2 21:13:18 2005
  blue.passwd                                 19  Tue Mar 29 00:30:43 2005
  public_html                         D        0  Tue Mar 29 13:03:07 2005

                43987 blocks of size 131072. 14865 blocks available
smb: \> exit
[root@LFS ~]#
?可以查看可用命令,使用它不如smbmount,mount方便

使用smbmount:
[root@LFS ~]#smbmount  //blue-lfs/software tmp/ -o username=blue,password=blue
这样就可以象挂载其他分区一样//blue-lfs/software的东东了 :)

使用mount :
[root@LFS ~]#mount -t smbfs -o username=blue,password=blue //blue-lfs/software tmp/

OK,完工 ^_^

- 作者: BlueSilence 2005年04月3日, 星期日 20:04  回复(2) |  引用(1) 加入博采

proc文件系统面面谈
了解一下这个有趣的东东吧 :)


什么是proc文件系统
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序 可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文 件系统是动态从系统内核读出所需信息并提交的。它的目录结构如下:

目录名称                       目录内容
apm                               高级电源管理信息
cmdline                          内核命令行
Cpuinfo                          关于Cpu信息
Devices                          可以用到的设备(块设备/字符设备)
Dma                               使用的DMA通道
Filesystems                支持的文件系统
Interrupts                  中断的使用
Ioports                          I/O端口的使用
Kcore                              内核核心印象
Kmsg                             内核消息
Ksyms                           内核符号表
Loadavg                          负载均衡
Locks                           内核锁
Meminfo                          内存信息
Misc                             杂项
Modules                          加载模块列表
Mounts                            加载的文件系统
Partitions                  系统识别的分区表
Rtc                               实时时钟
Slabinfo                       Slab池信息
Stat                             全面统计状态表
Swaps                             对换空间的利用情况
Version                          内核版本
Uptime                            系统正常运行时间  

并不是所有这些目录在你的系统中都有,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和 sys。Sys目录是可写的,可以通过它来访问或修改内核的参数(见下一部分),而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则 scsi目录不存在。  

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。Proc文件系统的名字就是由之而起。进程目 录的结构如下:  

目录名称                          目录内容
Cmdline                         命令行参数
Environ                         环境变量值
Fd                                   一个包含所有文件描述符的目录
Mem                               进程的内存被利用情况
Stat                             进程状态
Status                            进程当前状态,以可读的方式显示出来
Cwd                               当前工作目录的链接
Exe                               指向该进程的执行命令文件
Maps                             内存映象
Statm                              进程内存状态信息
Root                             链接此进程的root目录

用户如果要查看系统信息,可以用cat命令。例如:

# cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC Mouse
13: 1 XT-PIC fpu PS/2
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0  

用户还可以实现修改内核参数。在/proc文件系统中有一个有趣的目录:/proc/sys。它不仅提供了内核信息,而且可以通过它修改内核参 数,来优化你的系统。但是你必须很小心,因为可能会造成系统崩溃。最好是先找一台无关紧要的机子,调试成功后再应用到你的系统上。

要改变内核的参数,只要用vi编辑或echo参数重定向到文件中即可。下面有一个例子:  

# cat /proc/sys/fs/file-max
4096
# echo 8192 > /proc/sys/fs/file-max
# cat /proc/sys/fs/file-max
8192  

如果你优化了参数,则可以把它们写成添加到文件rc.local中,使它在系统启动时自动完成修改。

/proc文件系统中网络参数
在/proc/sys/net/ipv4/目录下,包含的是和tcp/ip协议相关的各种参数,下面我们就对这些网络参数加以详细的说明。

ip_forward  参数类型:BOOLEAN
0 - 关闭(默认值)
not 0 - 打开ip转发

在网络本地接口之间转发数据报。该参数非常特殊,对该参数的修改将导致其它所有相关配置参数恢复其默认值(对于主机参阅RFC1122,对于路由器参见RFC1812)

ip_default_ttl 参数类型:INTEGER
默认值为 64 。表示IP数据报的Time To Live值。

ip_no_pmtu_disc 参数类型:BOOLEAN
关闭路径MTU探测,默认值为FALSE

ipfrag_high_thresh  参数类型:整型
用来组装分段的IP包的最大内存量。当ipfrag_high_thresh数量的内存被分配来用来组装IP包,则IP分片处理器将丢弃数据报直到ipfrag_low_thresh数量的内存被用来组装IP包。

ipfrag_low_thresh 参数类型:整型
参见ipfrag_high_thresh。

ipfrag_time 参数类型:整型
保存一个IP分片在内存中的时间。

inet_peer_threshold  参数类型:整型
INET对端存储器某个合适值,当超过该阀值条目将被丢弃。该阀值同样决定生存时间以及废物收集通过的时间间隔。条目越多﹐存活期越低﹐GC 间隔越短

inet_peer_minttl  参数类型:整型
条目的最低存活期。在重组端必须要有足够的碎片(fragment)存活期。这个最低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies为单位测量。

inet_peer_maxttl  参数类型:整型
条目的最大存活期。在此期限到达之后﹐如果缓冲池没有耗尽压力的话(例如﹐缓冲池中的条目数目非常少)﹐不使用的条目将会超时。该值以 jiffies为单位测量。

inet_peer_gc_mintime  参数类型:整型
废物收集(GC)通过的最短间隔。这个间隔会影响到缓冲池中内存的高压力。 该值以 jiffies为单位测量。

inet_peer_gc_maxtime  参数类型:整型
废物收集(GC)通过的最大间隔,这个间隔会影响到缓冲池中内存的低压力。 该值以 jiffies为单位测量。

tcp_syn_retries  参数类型:整型
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右。

tcp_synack_retries  参数类型:整型
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。

tcp_keepalive_time  参数类型:整型
当keepalive打开的情况下,TCP发送keepalive消息的频率,默认值是2个小时。

tcp_keepalive_probes 参数类型:整型
TCP发送keepalive探测以确定该连接已经断开的次数,默认值是9。

tcp_keepalive_interval  参数类型:整型
探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。

tcp_retries1  参数类型:整型
当出现可疑情况而必须向网络层报告这个可疑状况之前﹐需要进行多少次重试。最低的 RFC 数值是 3 ﹐这也是默认值﹐根据RTO的值大约在3秒 - 8分钟之间。

tcp_retries2  参数类型:整型
在丢弃激活的TCP连接之前﹐需要进行多少次重试。RFC1122规定,该值必须大于100秒。默认值为15,根据RTO的值来决定,相当于13-30分钟,

tcp_orphan_retries  参数类型:整型
在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是 7 个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。

tcp_fin_timeout  参数类型:整型
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认 值为 60 秒。过去在2.2版本的内核中是 180 秒。您可以设置该值﹐但需要注意﹐如果您的机器为负载很重的web服务器﹐您可能要冒内存被大量无效数据报填满的风险﹐FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ﹐因为它们最多只吃 1.5K 的内存﹐但是它们存在时间更长。另外参考 tcp_max_orphans。  

tcp_max_tw_buckets  参数类型:整型
系统在同时所处理的最大timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要人为的降低这个限制﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。  

tcp_tw_recycle  参数类型:布尔
打开快速 TIME-WAIT sockets 回收。默认值是1。除非得到技术专家的建议或要求﹐请不要随意修改这个值。

tcp_max_orphans  参数类型:整型
系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制

tcp_abort_on_overflow  参数类型:布尔
当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。

tcp_syncookies  参数类型:整型
只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。默认值是false。

注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现synflood消息,但是调查发现没有收到synflood攻击, 而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.

syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。

tcp_stdurg  参数类型:整型
使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux 打开它﹐或会导致不能和它们正确沟通。默认值为为﹕FALSE

tcp_max_syn_backlog  参数类型:整型
对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ﹐以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐并且编进核心之内。

tcp_window_scaling  参数类型:布尔
正常来说,TCP/IP 可以接受最大到65535字节的 windows。对于宽带网络,该值可能是不够的,通过调整该参数有助于提高宽带服务器性能。

tcp_timestamps  参数类型:布尔
Timestamps 用在其它一些东西中﹐可以防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。

tcp_sack  参数类型:布尔
使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。

tcp_fack  参数类型:布尔
打开FACK拥塞避免和快速重传功能。

tcp_dsack  参数类型:布尔
允许TCP发送"两个完全相同"的SACK。

tcp_ecn  参数类型:布尔
打开TCP的直接拥塞通告功能。

tcp_reordering  参数类型:整型
TCP流中重排序的数据报最大数量默认值是 3 。

tcp_retrans_collapse  参数类型:布尔
对于某些有bug的打印机提供针对其bug的兼容性。

tcp_wmem - 三个整数的向量: min, default, max
min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4K。

default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16K。

max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。

tcp_rmem - 三个整数的向量: min, default, max
min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。

default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是默认值情况下,tcp 窗口大小为65535。

max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,今天选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。

tcp_mem - 三个整数的向量: low, pressure, high
low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。

high:允许所有tcp sockets用于排队缓冲数据报的页面量。

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

tcp_app_win - 整数

保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。默认值是31。

tcp_adv_win_scale - 整数
计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0),默认值为2。

ip_local_port_range - 两个整数
定于TCP和UDP使用的本地端口范围,第一个数是开始,第二个数是最后端口号,默认值依赖于系统中可用的内存数:
> 128Mb 32768-61000
< 128Mb 1024-4999 or even less.
该值决定了活动连接的数量,也就是系统可以并发的连接数

icmp_echo_ignore_all - 布尔类型
icmp_echo_ignore_broadcasts - 布尔类型
如果任何一个设置为true(>0)则系统将忽略所有发送给自己的ICMP ECHO请求或那些广播地址的请求。

icmp_destunreach_rate - 整数
icmp_paramprob_rate - 整数
icmp_timeexceed_rate - 整数
icmp_echoreply_rate - 整数(not enabled per default)
限制发向特定目标的ICMP数据报的最大速率。0表示没有任何限制,否则表示jiffies数据单位中允许发送的个数。

icmp_ignore_bogus_error_responses - 布尔类型
某些路由器违背RFC1122标准,其对广播帧发送伪造的响应来应答。这种违背行为通常会被以告警的方式记录在系统日志中。如果该选项设置为True,内核不会记录这种警告信息。默认值为False。

(1) Jiffie: 内核使用的内部时间单位,在i386系统上大小为1/100s,在Alpha中为1/1024S。在/usr/include/asm/param.h中的HZ定义有特定系统的值。

conf/interface/*:
conf/all/*是特定的,用来修改所有接口的设置,is special and changes the settings for all interfaces.
Change special settings per interface.

log_martians - 布尔类型
记录带有不允许的地址的数据报到内核日志中。

accept_redirects - 布尔类型
收发接收ICMP重定向消息。对于主机来说默认为True,对于用作路由器时默认值为False。

forwarding - 布尔类型
在该接口打开转发功能

mc_forwarding - 布尔类型
是否进行多播路由。只有内核编译有CONFIG_MROUTE并且有路由服务程序在运行该参数才有效。

proxy_arp - 布尔类型
打开proxy arp功能。

shared_media - 布尔类型
发送(路由器)或接收(主机) RFC1620 共享媒体重定向。覆盖ip_secure_redirects的值。默认为True。

secure_redirects - 布尔类型
仅仅接收发给默认网关列表中网关的ICMP重定向消息,默认值是TRUE。

send_redirects - 布尔类型
如果是router,发送重定向消息,默认值是TRUE

bootp_relay - 布尔类型
接收源地址为0.b.c.d,目的地址不是本机的数据报。用来支持BOOTP转发服务进程,该进程将捕获并转发该包。默认为False,目前还没有实现。

accept_source_route - 布尔类型
接收带有SRR选项的数据报。对于主机来说默认为False,对于用作路由器时默认值为True。

rp_filter  参数类型
1 - 通过反向路径回溯进行源地址验证(在RFC1812中定义)。对于单穴主机和stub网络路由器推荐使用该选项。
0 - 不通过反向路径回溯进行源地址验证。
默认值为0。某些发布在启动时自动将其打开。

- 作者: BlueSilence 2005年04月1日, 星期五 13:15  回复(1) |  引用(1) 加入博采

apache+mysql+php+phpmyadmin学习笔记
LAMP:linux下WEB服务器的经典组合 :) 还有一点httpd.conf配置说明 :)

注:Apache+MySQL+PHP安装按照http://bbs.linuxsir.org/showthread.php?t=171376进行的

安装MySQL-4.1.8a :


为了安全,创建mysql专用用户:
[root@LFS ~]#groupadd mysql
[root@LFS ~]#useradd -c mysql -d /dev/null -g mysql -s /bin/false mysql
解压:
[root@LFS ~]#tar zxvf mysql-4.1.8a.tar.gz
[root@LFS ~]#cd mysql-4.1.8a/
因为lfs-6.0中线程库是nptl,而编译mysql要检查linuxthread线程库,打上补丁:
[root@LFS mysql-4.1.8a]#patch -Np1 -i ../mysql-4.0.18-nptl-1.patch

编译(代码以pentium4级别cpu优化):
[root@LFS mysql-4.1.8a]#CC=gcc CFLAGS="-O3 -march=pentium4" \
CXX=gcc CXXFLAGS="-O3 -march=pentium4 -felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr --sysconfdir=/etc \
--libexecdir=/usr/sbin --localstatedir=/var/lib/mysql \
--enable-thread-safe-client --enable-local-infile \
--with-charset=ascii --with-extra-charsets=gb2312,utf8 \
--enable-assembler --without-debug --without-bench

[root@LFS mysql-4.1.8a]#make testdir=/usr/lib/mysql/mysql-test
安装:
[root@LFS mysql-4.1.8a]#make testdir=/usr/lib/mysql/mysql-test install
[root@LFS mysql-4.1.8a]#cd /usr/lib && ln -sf mysql/libmysqlclient{,_r}.so* .

配置mysql :

[root@LFS ~]#cp /usr/share/mysql/my-large.cnf /etc/my.cnf
初始化数据库:
[root@LFS ~]#mysql_install_db --user=mysql
启动mysql:
[root@LFS ~]#mysqld_safe --user=mysql &
[1] 6157
[root@LFS ~]#Starting mysqld daemon with databases from /var/lib/mysql
[root@LFS ~]#
更改mysql的root密码:
[root@LFS ~]#mysqladmin -u root password [new-password]
登陆:
[root@LFS ~]#mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.1.8a-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>exit
bye
[root@LFS ~]#
看到如上信息,表示mysql已经正常工作啦 :)
关闭它:
[root@LFS ~]#mysqladmin -p shutdown
Enter password:
STOPPING server from pid file /var/lib/mysql/BlueSilence.pid
050329 21:16:28  mysqld ended

[root@LFS ~]#

安装apache2 (httpd-2.0.53.tar.bz2):

创建apache专用用户:
[root@LFS ~]#groupadd apache
[root@LFS ~]#useradd -c apache -d /dev/null -g apache -s /bin/false apache
解压:
[root@LFS ~]#tar jxvf httpd-2.0.53.tar.bz2
[root@LFS ~]#cd httpd-2.0.53
打个可以自定义安装路径的patch :
[root@LFS httpd-2.0.53]#patch -Np1 -i ../httpd-2.0.53-config.patch
编译:
[root@LFS httpd-2.0.53]#./configure --enable-layout=FHS --enable-so --enable-mods-shared=all
[root@LFS httpd-2.0.53]#make
--enable-layout=FHS这就是刚刚patch的作用,根据FHS目录结构安装apache.
可以根据自己喜好修改patch中的安装目录结构,例如将配置文件安装到/etc/httpd而不是/etc/apache
将网页数据安装到/var/www/而不是/srv/www
需要支持ssl则加上--enable-ssl

编译可能出现如下错误:
exports.c:115:2: #endif without #if
make[2]: *** [exports.lo] Error 1
make[2]: Leaving directory `/data/packages/httpd-2.0.53/server'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/data/packages/httpd-2.0.53/server'
make: *** [all-recursive] Error 1
将server/exports.c 115行的#endif去掉,即可顺利编译
安装:
[root@LFS httpd-2.0.53]#make install
[root@LFS httpd-2.0.53]#chown -R apache:apache /srv/www

安装PHP:

解压:
[root@LFS ~]#tar jxvf php-5.0.3.tar.bz2
[root@LFS ~]#cd php-5.0.3
编译:(PHP可以支持很多东东,根据需要参看./configure --help) 
[root@LFS php-5.0.3]#./configure --prefix=/usr --sysconfdir=/etc \
--with-apxs2 --with-config-file-path=/etc \
--with-libxml-dir=/usr --with-xsl \
--enable-dba --with-openssl --with-regex=php \
--enable-bcmath --with-gnu-ld --with-tsrm-pthreads \
--with-zlib --with-bz2 --enable-ftp --with-gettext \
--with-mysql=/usr --with-mysqli=/usr/bin/mysql_config \
--enable-memory-limit --enable-zend-multibyte \
--with-iconv --with-ncurses
[root@LFS ~]#make
安装:
[root@LFS php-5.0.3]#make install
[root@LFS php-5.0.3]#cp php.ini-recommended /etc/php.ini

安装好后需要在/etc/apache/httpd.conf中增加php模块支持:
AddType application/x-httpd-php .php .php5

测试apache+php :
从源码编译安装的apache默认使用用户是nobody,nogroup,先修改成apache:
将302行左右的User,Group的nobody改成apache
启动apache:
[root@LFS ~]#apachectl start
Syntax error on line 251 of /etc/apache/httpd.conf:
Cannot load /usr/lib/apache/mod_dav.so into server: /usr/lib/apache/mod_dav.so: undefined symbol: ap_xml_parse_input
[root@LFS ~]#
如果出现如上信息,则需要注释掉以下两行:
#LoadModule dav_module lib/apache/mod_dav.so (251)
#LoadModule dav_fs_module lib/apache/mod_dav_fs.so  (257)

检查一下吧:
[root@LFS apache]#netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:6000                  *:*                     LISTEN
tcp        0      0 *:www-http              *:*                     LISTEN
[root@LFS apache]#
/var/log/apache/error_log最后一行要这样:
[root@LFS services]#tail -1 /var/log/apache/error_log
[Tue Mar 29 22:07:10 2005] [notice] Apache configured -- resuming normal operations
[root@LFS services]#firefox localhost
就应该看到apache的默认首页了 :)

测试php:

[root@LFS htdocs]#vi index.php
加入下面几行:

phpinfo();
?>
放置在/srv/www/htdocs (主页目录)
[root@LFS htdocs]#firefox localhost/index.php
就应该看到php 信息了 :)

配置apache :

/etc/apache/httpd.conf :

ServerRoot "/usr" 
#因为安装到/usr下,所以ServerRoot是/usr。在以下配置中,以相对路径写的就是对于相对/usr
PidFile /var/run/httpd.pid
#httpd启动时的pid存放位置,用于start/stop apache
Timeout 300
#连接超时时间
KeepAlive On
#允许持续连接,一个连接多个请求.
MaxKeepAliveRequests 200
#持续连接中最大连接数,推荐大一些获得最佳性能
KeepAliveTimeout 15
#Client 在15秒内没有下次请求则断线
MinSpareServers      5
MaxSpareServers      10
httpd服务进程的数量,ps aux 可以看到
MaxClients         150
最大连接人数
Listen 80
#监听端口
#ExtendedStatus On
#使用/server-status查询服务器状态时给予完全信息(ON)或基本信息(OFF) 默认为OFF
User apache
Group apache
#httpd进程的user,group
ServerAdmin BlueSilence.xin@gmail.com
#admin的E-mail
ServerName 127.0.0.1
#服务器名称,需要是合法的DNS NAME 或者设置成IP

DocumentRoot "/srv/www/htdocs"
#主页存放目录
UserDir public_html
#每个用户的主页目录 (例如:/home/blue/public_html)
DirectoryIndex index.php index.html index.html.var
#当输入http://localhost 就会在主页根目录下搜索以上几个文件名做为首页显示
HostnameLookups Off
#记录log时,Client以主机名(On)或以IP(Off)记录,以IP记录更快些.
ErrorLog /var/log/apache/error_log
#错误日志位置
LogLevel warn
#日志记录等级,由信息多->少记录等级:debug, info, notice, warn, error, crit,alert,emerg
CustomLog /var/log/apache/access_log common
#访问日志位置
ServerTokens Prod
#当client访问到不存在的网页时提供信息的多少。少点好些 :)
#由多-->少 :Full | OS | Minor | Minimal | Major | Prod
LanguagePriority zh-CN  en ca cs da de ..........
#语言优先级
ErrorDocument 404 /missing.html
#错误网页处理,当出现404(找不到该页)则会显示/missing.html

目录设定:
设定根目录属性:

    Options FollowSymLinks
    AllowOverride None

Options 属性:
Indexes         当该目录下没有index.*时则以ftp-style列出该目录下所有文件
Includes        Allow server-wide includes 
FollowSymLinks  当该目录下软连接的文件/目录链接到外部目录时,仍然可以正常显示。
MultiViews      由一个*.var管理同一网页的多种语言版本,如apache默认主页多种语言的index.html
ExecCGI         允许执行CGI程序
ALL             开启除MultiViews之外的属性
None            禁止所有属性

AllowOverride  是否允许使用.htaccess覆盖某些设定(All None FileInfo AuthConfig Limit)

设定/srv/www/htdocs/ 目录(根目录)属性:


  Options Indexes FollowSymLinks
  AllowOverride None
  Order allow,deny
    Allow from all


Order allow,deny : 控制访问权限
Order deny,allow
  deny from  test.org  拒绝test.org访问
  deny from  192.168.0.100 拒绝192.168.0.100访问
  allow from  192.168.0.1  允许192.168.0.1  访问
  
Alias /icons/ "/srv/www/icons/"  
语法: Alias fakename realname
设置目录的别名,这样当输入http://localhost/icons/ 就可以访问到/srv/www/icons/
注意icons结尾的"/" 应在fakename realname 成对出现,要么全有,要么全没有.
有"/"时需要输入http://localhost/icons/ 才可以正常访问

ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"
设置可执行程序别名,与Alias类似。
当Client请求Alias realname时,server直接以document形式传送Client
而ScroptAlias则是server执行realname的script程序后将结果传送给Client

服务器的状态,信息:
通过http://localhost/server-status 访问

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1

通过http://localhost/server-info 访问

    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from  127.0.0.1


.cgi .pl程序可执行的三种方法:
1:使用ScriptAlias,httpd.conf中加入:
ScriptAlias /my-cgi/  "/srv/www/cgi" 
这样就可以以http://localhost/my-cgi/xxx.cgi xxx.pl执行/srv/www/cgi/下的.cgi,.pl程序了。

2: 使用sethandler cgi-scripts,httpd.conf中加入:
Alias /my-cgi/  "/srv/www/cgi"

   Options ExecCGI
   Sethandler cgi-script


3:使用Options的ExecCGI属性 :
将httpd.conf中的AddHandler cgi-script .cgi .pl 注释拿掉,加上.pl
给予/srv/www/cgi/ 执行CGI权限:
Alias /my-cgi/  "/srv/www/cgi"

   Options ExecCGI
   Allowoverride none
   Order allow,deny
   allow from all


认证网页:


   Options FollowSymlinks Indexes ExecCGI
   AllowOverride None
   Order Allow,Deny
     Allow From all
   AuthName "private directory "
   AuthType Basic
   AuthUserFile  /etc/apace/apache.passwd
   Require  valid-user

 
AuthNmae :      认证窗口上的标题
AuthType :      认证类型,apache有几种认证方式,Basic为最基本的。
AuthUserFIle :  认证密码存放位置
Require  :     认证档案中允许使用的用户
valid-user :   认证档案中所有的用户都可以使用通过认证进入该目录
如只想允许某个用户则使用 Require user  username1  username2

建立认证密码文件:
[root@LFS ~]#cd /etc/apache/
[root@LFS apache]#htpasswd -c apache.passwd blue
New password:
Re-type new password:
Adding password for user blue
[root@LFS apache]#
-c : 如果没有apache.passwd则创建它
增加认证用户:
[root@LFS apache]#htpasswd apache.passwd silence
....
[root@LFS apache]#apachectl restart
[root@LFS apache]#firefox http://localhost/my-cgi/
要求密码才可以进入喽 :)

.htaccess 和 allowoverride :

.htaccess : 取代httpd.conf中对.htaccess所在目录的设定。
AllowOverride :允许覆盖设定的类型(All None FileInfo AuthConfig Limit)

设定每个用户都可以建立自己的认证网页:

1.确定httpd.conf中AccessFileName .htaccess 没有被注释掉
2.编辑httpd.conf加入AllowOverride AuthConfig,允许每个用户通过.htaccess建立自己的认证网页

   AllowOverride AuthConfig
    Order Allow,Deny
     Allow from all

3.用户建立认证目录,编写.htaccess :
[blue@LFS public_html]#mkdir private
[blue@LFS public_html]#cd private/
[blue@LFS private]#echo " private page " >test.html
[blue@LFS private]#vi .htaccess
AuthName  "private"
AuthType  basic
AuthUserFIle  /home/blue/blue.passwd
Require  valid-user
建立密码文件:
[blue@LFS ~]htpasswd -c blue.passwd blue
......
[blue@LFS ~]firefox http://localhost/~blue/private/test.html
又需要密码喽 :)

安装phpMyAdmin :
phpMyAdmin是一个使用PHP编写的、基于Web的MySQL客户端程序,支持简体中文,允许用户使用Web浏览器来管理MySQL数据库。
如果对mysql不熟悉,使用它管理会很轻松 :)
http://sourceforge.net/projects/phpmyadmin/ 在这里可以下到
安装:
[root@LFS ~]#tar jxvf phpMyAdmin-2.6.2-beta1.tar.bz2
[root@LFS ~]#mv phpMyAdmin-2.6.2-beta1 phpmyadmin
放到主页根目录下:
[root@LFS ~]#mv phpmyadmin /srv/www/htdocs
配置phpmyadmin:
[root@LFS ~]#cd /srv/www/htdocs/phpmyadmin
[root@LFS phpmyadmin]#vi config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin';
phpmyadmin所在位置

$cfg['Servers'][$i]['host']          = 'localhost'; // MySQL hostname or IP address
设定成MySQL所在的主机名或IP

$cfg['Servers'][$i]['auth_type']     = 'config';    // Authentication method (config, http or cookie based)?
phpmyadmin认证类型,config直接使用此配置文件,不需要密码确认。其余两项从数据库认证

$cfg['Servers'][$i]['user']          = 'root';      // MySQL user
MYSQL帐号

$cfg['Servers'][$i]['password']      = 'blue';          // MySQL password (only needed
MYSQL密码
其余选项不用修改,保存退出。

[root@LFS ~]#firefox http://localhost/phpmyadmin
可以看到phpmyadmin主界面了  :)

OK,完工  ^_^

MySQL,httpd补丁:(放在源码目录的上级目录中)
http://blog.blogchina.com/upload/2005-03-31/20050331022108306811.gz
http://blog.blogchina.com/upload/2005-03-31/20050331022055777241.gz





- 作者: BlueSilence 2005年03月31日, 星期四 02:32  回复(0) |  引用(1) 加入博采

vsftpd学习笔记
vsftp是一个高速,稳定,安全的ftp server,目前有许多大型ftp站点都使用它,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org..etc
对比同类server(proftpd,wu-ftpd),它配置起来更简单,更安全。 它能让你快速的搭建起一个即稳定又安全的ftp server ^_^


VSftpd(Very Secure FTP Daemon)特点:
高速,稳定,比同类ftp server(wu-ftpd,proftpd)更安全.设定更简单

vsftp安装:
下载:
ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.1.tar.gz
解压:
[root@LFS ~]#tar zxvf vsftpd-2.0.1.tar.gz
[root@LFS ~]#cd vsftpd-2.0.1
如果需要vsftp支持tcpwrappers,ssl在make前编辑 builddefs.h:
[root@LFS vsftpd-2.0.1]#echo "#define VSF_BUILD_TCPWRAPPERS" >>builddefs.h
[root@LFS vsftpd-2.0.1]#echo "#define VSF_BUILD_SSL" >>builddefs.h
编译:
[root@LFS vsftpd-2.0.1]#make
编译后生成vsftpd binary文件:
[root@LFS vsftpd-2.0.1]#ls -l vsftpd
-rwxr-xr-x  1 root root 88072 Mar 26 12:09 vsftpd*
[root@LFS vsftpd-2.0.1]#
创建必要的帐号,目录:
[root@LFS vsftpd-2.0.1]#useradd nobody
[root@LFS vsftpd-2.0.1]#mkdir /usr/share/empty
如果需要匿名用户访问还需要创建ftp用户:
[root@LFS vsftpd-2.0.1]#mkdir /var/ftp
[root@LFS vsftpd-2.0.1]#useradd -d /var/ftp ftp
设定安全权限:
[root@LFS vsftpd-2.0.1]#chown root:root /var/ftp
[root@LFS vsftpd-2.0.1]#chmod og-w /var/ftp
安装vsftp配置文件,可执行程序,man等:
[root@LFS vsftpd-2.0.1]#install -m 755 vsftpd /usr/sbin/vsftpd
[root@LFS vsftpd-2.0.1]#install -m 644 vsftpd.8 /usr/share/man/man8
[root@LFS vsftpd-2.0.1]#install -m 644 vsftpd.conf.5 /usr/share/man/man5
[root@LFS vsftpd-2.0.1]#install -m 644 vsftpd.conf /etc
OK,安装好啦,看看该如何配置它吧 :)

vsftp的配置文件/etc/vsftpd.conf, 基本都是自解释的,很简单,并且有相关说明还可以通过man vsftpd.conf 查看所有参数具体说明

vsftpd配置:
/etc/vsftpd.conf :
anonymous_enable=YES  
#允许匿名访问
local_enable=YES      
#允许本地用户访问(/etc/passwd中的用户)
write_enable=YES
#允许写入权限,包括修改,删除
local_umask=022
#本地用户文件上传后的权限是-rw-r-r
#anon_umask=077
#匿名用户上传后权限是-rw----
anon_world_readable_only=YES
#允许匿名用户浏览,下载文件
anon_upload_enable=YES
#允许匿名用户上传
#anon_mkdir_write_enable=YES
#允许匿名用户建立目录
anon_other_write_enable=YES
#允许匿名用户具有建立目录,上传之外的权限,如重命名,删除
dirmessage_enable=YES
#当使用者转换目录,则会显示该目录下的.message信息
xferlog_enable=YES
#记录s使用者所有上传下载信息
xferlog_file=/var/log/vsftpd.log
#将上传下载信息记录到/var/log/vsftpd.log中
connect_from_port_20=YES
#确保ftp-datad 数据传送使用port 20
idle_session_timeout=600
#如果使用者600秒没有动作,则踢出

chroot_list_enable=YES

#限制使用者不能离开家目录,例如blue登陆后位于/home/blue下,设置该选项后,他不可以转到/home/blue的上层目录,如/bin, /usr,/opt...etc。
chroot_list_file=/etc/vsftpd.chroot_list
#与上条同时使用,设置限制使用者的存放文件为/etc/vsftpd.chroot_list
#建立文本文件/etc/vsftpd.chroot_list,写入要限制的用户,一行一个。
#如果希望限制所有用户,则可以设置chroot_local_user=YES 代替上面两行

tcp_wrappers=YES
#支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)
listen=YES
#使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)
listen_port=21
#ftp监听端口
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.user_list
#以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.user_list中,一行一个帐号
pam_service_name=vsftpd
#PAM所使用的名称.同userlist_*一样限制用户登陆,不同的是userlist_*在进 行密码验证之前拒绝用户登陆,pam是在密码验证之后拒绝登陆.(提示密码错误) 用户列表默认存放在/etc/ftpusers中,一行一个. (可通过/etc/pam.d/vsftpd重定向用户列表存放文件)
#获得 /etc/pam.d/vsftpd:
#[root@LFS vsftpd-2.0.1]#cp RedHat/vsftpd.pam /etc/pam.d/vsftpd


max_clients=100
#最大用户在线数量
max_per_ip=2
#每ip最大线程
anon_max_rate=30000
#匿名用户最大传输速度  单位: bytes/秒
local_max_rate=50000
#本地用户最大传输速度  单位:bytes/秒
user_config_dir=/etc/userconf
#个别用户配置目录(用来设定特殊帐号),例如我想让blue这个用户的传输速度是100KB
就可以在/etc/userconf/下创建文本文件blue(与用户名相同),加入local_max_rate=100000即可
anon_root=/var/ftp
#设定匿名用户登陆后所在的目录
local_root=/var/local_user
#设定所有本地用户登陆后的目录,如不设置此项,则本地用户登陆后位于各自家目录下。
use_localtime=YES
#使用本地时间而不是GMT

nopriv_user=vsftpd
#设定服务执行者为vsftpd,默认使用的是nobody,vsftpd推荐使用一个权限很低的用户.这里用vsftpd代替nobody,创建 vsftpd用户:
[root@LFS vsftpd-2.0.1]#groupadd vsftpd
[root@LFS vsftpd-2.0.1]#useradd -d /dev/null -g vsftpd -s /bin/false vsftpd
这样就有了个权限非常低的vsftpd用户(没有家目录(/dev/null),没有登陆shell(/bin/false),系统会更安全,设定好后就 可以启动啦 :)
[root@LFS etc]#/usr/sbin/vsftpd
[root@LFS etc]#netstat -tul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:6000                  *:*                     LISTEN
tcp        0      0 *:ftp                   *:*                     LISTEN
[root@LFS etc]#
OK,ftp已经启动喽 ^_^

- 作者: BlueSilence 2005年03月27日, 星期日 00:35  回复(3) |  引用(2) 加入博采

vmware,qemu各种方式上网设置
vmware三种网络连接,qemu两种网络连接实现 虚拟机<--->主机 虚拟机<--->互联网通信的方法。
顺便写了下如何不重新编译整个内核支持某个功能,对系统无影响,编译速度要快于编译整个内核。
如果你的XXX卡没被内核支持,又怕自己编译的内核会造成系统损坏就可以试试这个方法喽 ^_^


vmware三种网络连接上网设置:

1.bridge : 
默认使用vmnet0
将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:
例如主机ip是10.70.54.31,设置虚拟机ip为10.70.54.22。netmask,broadcast,gateway,dns都与主机相同即可实现虚拟机<--->主机 虚拟机<---->互联网 通信。

2.nat :
默认使用vmnet8
将虚拟机设置成使用dhcp方式上网,windows下选择"自动获取ip",linux下开启dhcp服务即可
也可以手动设置:
ip设置与vmnet8同网段,gateway设置成vmnet8的gateway(/etc/vmware/vmnet8/nat/nat.conf)中可以查到vmnet8的gateway,通常是xxx.xxx.xxx.2。
netmask,broadcast设置与vmnet8相同,dns设置与主机相同。
例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2
虚拟机设置: ip :172.16.249.100  gw: 172.16.249.2

3.host-only :
默认使用vmnet1

将虚拟机ip设置与vmnet1同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同
例如 vmnet1 ip :172.16.245.1
虚拟机设置: ip :172.16.245.100 gateway :172.16.245.1
这样就实现了虚拟机<--->主机 通信,但是 虚拟机<--->互联网 仍无法通信

虚拟机与互联网通信:
1.开启主机路由功能
2.设定iptables,使主机成为一台nat server
1. echo 1 >/proc/sys/net/ipv4/ip_forward 这样就主机就具有了路由功能
2. iptables -t nat -A POSTROUTING -o eth0 -s 172.16.245.0/24 -j MASQUERADE
这条规则意思是将来自172.16.245.0/24封包的来源ip伪装成eth0的ip,实现虚拟机与互联网通信
如果网络接口是ppp+或pppoe则需要修改成-o pppoe 
当然-s  172.16.245.0/24 也要根据实际情况修改

qemu两种上网方式:

user mode network :
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数,虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。

tap/tun network :
这种方式要比user mode复杂一些,但是设置好后 虚拟机<-->互联网 虚拟机<-->主机 通信都很容易
这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增加一块虚拟网络设备(tun0),然后就可以象真实网卡一样配置它.

首先内核中支持tap/tuns设备:
Device Drivers  ---> 
     Networking support  --->
        [M] Universal TUN/TAP device driver support
如果当前内核没有支持,可以重新只编译相应模块加入,方法很简单:

将当前内核配置文件cp到内核源码目录下:
[root@LFS ~]#cp /boot/config-[kernel-version] /usr/src/linux
[root@LFS ~]#cd /usr/src/linux
配置内核,将TUN/TAP选择模块(M),如上所示:
[root@LFS ~]#make menuconfig
重新只编译模块(M),不编译核心(*)支持的东东:
[root@LFS ~]#make modules
编译好后在/usr/src/linux/drivers/net下可以找到tun.ko:
[root@LFS net]#ls -l /usr/src/linux/drivers/net/tun.ko
-rw-r--r--  1 root root 11116 Mar 23 20:29 /usr/src/linux/drivers/net/tun.ko
[root@LFS net]#
将它cp到当前内核的模块目录的相应位置:
[root@LFS net]#cp /usr/src/linux/drivers/net/tun.ko /lib/modules/`uname -r`/kernel/drivers/net
重新建立模块依赖关系: 
[root@LFS net]#depmod
现在就可以加载它了 :
[root@LFS net]#modprobe tun
检查一下:
[root@LFS net]#lsmod |grep tun
tun                     8704  0
[root@LFS net]#
OK. 成功不重新编译整个内核加入特殊模块支持

如果你的xx卡不被内核支持,又可以编译成模块,自己怕重新编译内核后出问题就可以用这个办法只编译自己需要的模块,然后手动安装到相应位置,再加载它。
这样编译速度要也比编译整个内核快,不会对系统有任何损害,就可以使用上XX卡喽。^_^

要注意三点:
1.内核源码必须与当前内核版本完全一致,否则编译出的模块是不能用的。
2.注意只make modules(编译模块),没有make modules_install(自动安装模块到/lib/modules下)
3.加载新编译的模块前必须先运行depmod,否则modprobe找不到它

其实使用当前内核配置文件(/boot/config-[kernel-version]),只加入自己需要的模块,不做任何其他改,make modules_install应该也不会有问题的。
不过最稳妥的办法还是手动安装它,控制权在自己手里更踏实嘛 :-)

OK,转回qemu上网问题 :)

如果使用udev管理设备(通常2.6.x内核的发行版都已经使用udev),当modprobe tun后就会自动建立/dev/net目录,并创建出tun设备,做好相关链接:
[root@LFS net]#ls -l /dev/net/tun
lrwxrwxrwx  1 root root 6 Mar 25 15:35 /dev/net/tun -> ../tun
[root@LFS net]#

如果很不幸,你没看到它,就需要自己手动做这些工作了 :(
[root@LFS ~]#mkdir /dev/net
[root@LFS ~]#mknod /dev/net/tun c 10 200
OK,相关设备已经准备好了,还需要一个tun/tap的初始化脚本 :
/etc/qemu-ifup :
#!/bin/sh
/sbin/ifconfig $1 172.20.0.1
再给予qemu-ifup x执行权限放在/etc下就可以了。
这个脚本只能root用户执行,如果需要普通用户使用qemu,就需要改成sudo /sbin/ifconfig .....再设置sudo相关权限。
启动qemu后,它会在主机上增加一块虚拟网络设备(tun0):
[root@LFS ~]#ifconfig tun0
tun0      Link encap:Ethernet  HWaddr 0A:D3:8A:5D:97:CD
          inet addr:172.20.0.1  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
[root@LFS ~]#
现在就可以启动qemu配置虚拟机网络参数了,和vmware host-only一样:
ip与tun0相同网段,gateway为tun0 ip 其余参数与tun0相同,dns与主机相同:
tun0 : ip :172.20.0.1 broadcast:172.20.255.255 netmask :255.255.0.0
qemu : ip :172.20.0.100 broadcast:172.20.255.255 netmask :255.255.0.0 gateway:172.20.0.1

与host-only一样,这样只实现了虚拟机<---->主机间通信,还需要设置router,nat才可以连上互联网
[root@LFS ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@LFS ~]#iptables -t nat -A POSTROUTING -o eth0 -s 172.20.0.0/24 -j MASQUERADE
[root@LFS ~]#

OK,虚拟机<--->主机 虚拟机<---->互联网通信 都完成啦
快去做网络实验吧 ^_^


- 作者: BlueSilence 2005年03月25日, 星期五 16:45  回复(0) |  引用(1) 加入博采

在chroot环境中运行GUI程序
很有趣,在lfs中直接运行mdk里的gui程序. 系统挂掉,只会用gui程序配置系统的newbie会很有帮助哦 ^_^

在lfs中,有时我想运行MDK里的一些gui程序,不重启的办法是ctrl-alt-Fn切换到字符终端chroot /mnt/mdkstartx -- :1,不过这样有时不方便 :(
今天找到了一种更方便的办法,可以在lfs中直接运行mdk的程序 :)

在lfs图形终端里chroot进去:
[root@LFS ~]#chroot /mnt/mdk
先运行个gui程序试试:
[root@LFS usr]#xlogo
Error: Can't open display: :0
[root@LFS usr]#
不行 :( 
X-window可以远程显示gui程序,我想将mdk的程序看做是X-client,lfs的X是X-server,让mdk的程序"远程"的显示到lfs中,这样就应该可以了吧 :)

做起来也很简单:

在lfs中再打开个终端,设定允许X-client显示到X-server上:
[root@LFS root]#xhost +
access control disabled, clients can connect from any host
[root@LFS root]#

在mdk shell下执行:
[root@MDK ~]#export DISPLAY=127.0.0.1:0.0
[root@MDK ~]#echo $DISPLAY
127.0.0.1:0
[root@MDK ~]#
OK啦,来个beep-media-player试试 :)
[root@MDK ~]#beep-media-player

如果某些程序提示缺少xxx设别文件,就cp -a /dev/xxx /mnt/mdk/dev复制过去几个就可以了。
不过有些程序不能运行,例如xmms.

如果哪天不幸系统挂掉了,用liveCD启动后,发现自己只会用gui程序配置系统,就可以用到这个方法了
chroot嘛,所有改动都是对于目标系统的。
例如MDK用户就可以用强大的drakeconf来恢复系统, so easy ! ^_^

- 作者: BlueSilence 2005年03月23日, 星期三 13:03  回复(0) |  引用(2) 加入博采

X-window简略笔记
X-window的一点学习笔记 ^_^

Q:为什么我的鼠标无法使用滚轮?
A:修改X配置文件,找到下面这一段,增加红色部分:
/etc/X11/xorg.conf或/etc/X11/XF86Config
Section "Input Device"
     Identifier "Mouse0"
     Driver     "mouse"
     Option     "Protocol" "IMPS/2"
     Option     "Device"   "/dev/psaux"
     Option     "ZAxisMapping" "4 5"    
EndSection
"4 5 " 表示鼠标中键模拟"上下"键。
Protocol要用IMPS/2而不是PS/2

X的一些安全设置: (注:在xorg 6.8.1环境下)
/etc/X11/xorg.conf中添加:
Section "ServerFlags"
#Disable switching from the GUI to other virtual terminals
#Option "DontVTSwitch" "on"
#DontZap # disable (server abort)
#DontZoom # disable / (resolution switching)
AllowMouseOpenFail # allows the server to start up even if
 the mouse doesn't work
EndSection

Option "DontVTSwitch" "on" 禁止在GUI下ctrl-alt-Fn切换到终端
DontZap 禁止使用ctrl-alt-backspace退出X

DontZoom 禁止使用ctrl-alt-[+,-]调整分辨率
AllowMouseOpenFail 允许启动X即使鼠标不工作
否则当鼠标无法使用时,无法启动X,并且按键也无响应,呈死机状,实际
linux仍然在运行
只能按reset按钮,有可能造成系统损坏。 :(

设定konsole启动的位置:

KDE这个konsole每次启动时都在左上角,每次都要手动移动到中间
很烦人,于是写个小脚本包装下,添加到任务栏中,这样它就出现在
我想的地方了 :) 
konsole.sh :
#!/bin/bash
konsole -geometry 733x565+250+300

-geometry XSIZExYSIZE+XOFF+YOFF
XSIZExYSIZE是窗口的大小,XOFF+YOFF是窗口的位置,以左上角偏移。

在本机上显示远程主机程序:

remote host ip : 10.70.54.5
local host ip : 10.70.54.31

1. 进入X-window,打开终端,设定允许远程主机的程序(X-cilent)
在本机(X-server)显示: 
xhost + 10.70.54.5

2. 登陆到远程主机,设定DISPLAY变量将程序显示到本机上:
export DISPLAY=10.70.54.31:0.0

3.运行程序 :)

在本机上也可以设定DISPLAY变量将程序显示到不同的X中:
启动X,终端输入echo $DISPLAY:
[root@LFS ~]#echo $DISPLAY
:0.0
[root@LFS ~]#
ctrl-alt-F2切换到文本终端下输入:
[root@LFS ~]#startx -- : 1
这样就又启动个X,ctrl-alt-F8切换进去,在终端输入:
[root@LFS ~]#echo $DISPLAY
:1.0
[root@LFS ~]#
ctrl-alt-F7回到第一个X,修改DISPLAY:
[root@LFS ~]#export DISPLAY=:1.0
[root@LFS ~]#xmms
xmms就会出现在第二个X里^_^
在文本终端设定对应的DISPLAY变量,就可以将程序显示到
相应的X中。 

X启动时读取的配置文件:
~/.xinitrc :startx时读取,X启动时需要背景运行的程序
及window manager
如果不存在则读取/etc/X11/xinit/xinitrc
例:startx启动X时自动运行fcitx及启动KDE环境。
/usr/local/bin/fcitx &
exec startkde

以下两个文件由switchdesk创建:
~/.Xclients : 执行.Xclients-default
exec .Xclients-default
 
~/.Xclients-default : 启动桌面环境,如kde,fvwm,
这里会覆盖掉/etc/sysconfig/desktop的设定
exec startkde

~/.xsession : 由Display Manager(kdm,xdm,gdm)读取
.如果不存在则读取~/.Xclients 


- 作者: BlueSilence 2005年03月21日, 星期一 20:15  回复(0) |  引用(2) 加入博采

剖析Linux系统启动过程
一篇很不错讲解linux系统启动过程的文章!


剖析Linux系统启动过程

来自:天极网
作者:Terry Yu

剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程......

本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。

  阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析 Linux的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。而启动 过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:

  当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub 开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序, rc.sysinit 和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了 Shell,这样就完成了从开机到登录的整个启动过程。

下面就将逐一介绍其中几个关键的部分:

 第一部分:内核的引导(核内引导)

  Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权, 然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中 的"arch/i386/boot"下的这几个文件:bootsect.S、setup.S、video.S等。

  其中bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将 系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中 的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。

  那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?

  0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了"makebzImage"方式,从而生成压缩过的内核,在RedHat中内 核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用 misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。

  当CPU跳到0x100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是 vmlinux 的入口,然后就跳转到start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数, start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本 的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。

  在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主 要是来进行一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件 系统的安装。

  当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文 件 stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了。

  第二部分:运行init

  init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序,。 init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。在Redhat系统中, inittab的内容如下所示(以"###"开始的中注释为笔者增加的):

  #
  # inittab This file describes how the INIT process should set up
  # the system in a certain run-level.
  #
  # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
  # Modified for RHS Linux by Marc Ewing and Donnie Barnes
  #

  # Default runlevel. The runlevels used by RHS are:
  # 0 - halt (Do NOT set initdefault to this)
  # 1 - Single user mode
  # 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
  # 3 - Full multiuser mode
  # 4 - unused
  # 5 - X11
  # 6 - reboot (Do NOT set initdefault to this)
  #
  ###表示当前缺省运行级别为5(initdefault);
  id:5:initdefault:

  ###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)
  # System initialization.
  si::sysinit:/etc/rc.d/rc.sysinit

  l0:0:wait:/etc/rc.d/rc 0
  l1:1:wait:/etc/rc.d/rc 1
  l2:2:wait:/etc/rc.d/rc 2
  l3:3:wait:/etc/rc.d/rc 3
  l4:4:wait:/etc/rc.d/rc 4
  ###当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6

  ###在启动过程中允许按CTRL-ALT-DELETE重启系统
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  # When our UPS tells us power has failed, assume we have a few minutes
  # of power left. Schedule a shutdown for 2 minutes from now.
  # This does, of course, assume you have powerd installed and your
  # UPS connected and working correctly.
  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

  # If power was restored before the shutdown kicked in, cancel it.
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

  ###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
  ###如果进程退出则再次运行mingetty程序(respawn)
  # Run gettys in standard runlevels
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  ###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出