工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

linux大硬盘分区parted

linux大硬盘分区parted

我们来看一下两种分区表
MBR
分区表:(MBR含义:主引导记录)
所支持的最大卷:2T T; terabytes,1TB=1024GB
对分区的设限:最多4个主分区或3个主分区加一个扩展分区(扩展分区中支持无限制的逻辑驱动器)

GPT
分区表:(GPT含义:GUID分区表)
支持最大卷:18EB,(Eexabytes,1EB=1024TB
每个磁盘最多支持128个分区

假设要用parted/dev/sdb(大小为6000G)进行分区操作:

1
、进入系统执行:
#parted /dev/sdb

2
、建立磁盘label

mklabel GPT

3
、按p键,查看磁盘可用空间,显示单位为M6000G应该显示大致

: /dev/sdb 的磁盘几何结构:0.000-6000000.000 兆字节

4
、创建分区:
(parted)后输入:
mkpart
并按照提示操作

分区类型? primary/主分区/extended/扩展分区? p (如果要创建扩展分区 此处
输入e
文件系统类型? [ext2]? (这里直接回车,分区创建完毕后通过mkfs.ext3
/dev/sdb*
建立文件系统)
起始点?0
结束点?-1

5
、按p键查看刚创建的分区是否已经成功。

6
、如果成功,键入quit退出parted

7
、使用mkfs.ext3 /dev/sdb1 来创建文件系统

 
fdisk
命令虽然很交互,操作也方便,但是对于大于2T的磁盘无法操作,如果我们想用大于2T的磁盘怎么办?可以把磁盘转化为GPT格式。
 

GPT
格式的磁盘相当于原来MBR磁盘中原来保留4partition table4*16个字节只留第一个16个字节,类似于扩展分区,真正的partition table512字节之后,GPT磁盘没有四个主分区的限制。


fdisk不支持GPT,我们可以使用parted来对GPT磁盘操作。

parted
功能很强大,既可用命令行也可以用于交互式


在提示符下输入parted就会进入交互式模式,如果有多个磁盘的话,我们需要运行select sdx x为磁盘,来进行磁盘的选择

parted>

parted>select sdb               
假设磁盘为sdb

parted>mklable gpt              
MBR磁盘格式化为GPT

parted>mklable msdos            
GPT磁盘转化为MBR磁盘

parted>mkpart primary 0 100     
划分一个起始位置为0大小为100M的主分区

parted>mkpart primary 100 200   
划分一个起始位置为100M大小为100M的主分区

parted>print                    
打印当前分区

 

parted里边不支持ext3的文件系统,所以如果要使用的话,要退出parted进行格式话

mkfs.ext3 /dev/sdx1

因为fdisk是不支持GPT磁盘,所以不要使用fdisk -l来查看X磁盘刚才分好的区,看不到的。


命令行的模式:
将硬盘转化为GPT磁盘后,执行下列命令

parted /dev/sdx mkpart primary 0 100  
划分一个起始位置为0大小为100M的主分区

Acronym for GUID Partition Table

GPT was introduced for iA64 systems, to get around a fixed 32 bit issue (2 to the power of 32 is 4 billion times a 512 byte block equals 2 Terabytes) in the PC-BIOS Partition table. Partitions larger than 2 TB require using a GPT disklabel, which differs from the PC-BIOS Partition table in a number of ways:

    * Is easily extensible.
    * Can contain up to 128 primary partitions, as opposed to 4, so there's no need for extended partitions.
    * Allows Partitions larger than 2 TB.
    * Identifies Partitions with a GUID so you can reference that Partition even if disks are moved around.
    * Identifies Partition type with a GUID, thus avoiding the type conflicts that plague the PC-BIOS Partition table format.
    * Provides a 46(?) character UTF-16 partition label to identify Partitions.
    * Has a "fake" MBR for backwards compatibility.
    * Includes a CRC32 to detect corrupt Partition tables.
    * Stores a backup Partition table at the end of the disk.

Most partitioning tools under Linux will fail to do anything sensible with a > 2 TB Partition. As of this writing, parted(8) is the only one that understands them and will let you set the GPT label on the disk.

There is a lot of information stating that you cannot boot off a GPT enabled device. Most of the claims imply that the fault is with LILO or GRUB not understanding GPT devices. We've not tested this, but GPT and traditional MBRs will coexist.

See also:

    * Disk Sectors on GPT Disks from the MS Knowledge Base

所以在超过2TB,我不能使用交互很好的Fdisk命令,只能磁盘转化为GPT格式。由于GPT格式的磁盘相当于原来MBR磁盘中原来保留4 partition table4*16个字节只留第一个16个字节,其它的类似于扩展分区,真正的partition table512字节之后,所以对GPT磁盘表来讲没有四个主分区的限制。

GPT磁盘分区表进行操作,我们要使用parted命令。其实parted功能很强大,它可以象fdisk一样既可用命令行也可以用于交互式.
下面我们就来实际操作吧,在提示符下输入parted就会进入交互式模式

#  parted  /dev/sdb
GNU  Parted  1.8.1
Using  /dev/sdb
Welcome  to  GNU  Parted!  Type  'help'  to  view  a  list  of  commands.

(parted) mklabel gpt
MBR磁盘格式化为GPT

(parted) mkpart primary 0 100
划分一个起始位置为0大小为100M的主分区

(parted) mkpart primary 100 200
划分一个起始位置为100M大小为100M的主分区

(parted)  mkpart  primary  0  -1

划分所有空间到一个分区

(parted)  print
打印当前分区

(parted)  quit

可能还会用到的一些命令

(parted) mklable msdos
如果要反过来.GPT磁盘转化为MBR磁盘

在这样分完分区后,还要使用mkfs.ext3来进行格式化
#partprobe
#mkfs.ext3 -F /dev/sdb1

记的哦,因为fdisk是不支持GPT磁盘,所以使用fdisk -l来查看磁盘刚才的分区是没有用的.

命令行的模式:

将硬盘转化为GPT磁盘后,执行下列命令

parted /dev/sdx mkpart primary 0 100
##
划分一个起始位置为0大小为100M的主分区

 

parted /dev/sdb
p
mklabel gpt
GPT
mkpart primary 0 -1
mkfs.ext3 /dev/sdb1

《关于linux下tc限速的代码》的说明(转)

首先说明下,在写脚本时,记得要用vi写,其它的文本编辑器不要用,因为会出来许多不知名的字符。

个人认为在vi中输入(:set nu)显示行号,更加适合编辑。

如果eth1网卡上用来上外网,eth2是用来作内网共享上网。tc只能控制发送的数据量所以要写下载的话,只能写在eth2网卡上。

一,先记得清空eth2旧有队列,再作根队列进行绑定这个网卡

tc qdisc del dev eth2 root
tc qdisc add dev eth2 root handle 2: htb default 20

注:这里有一个默认就是选择2:20

二,作根类

tc class add dev eth2 parent 2:0 classid 2:1 htb rate 100kbit

这里也作了根类的限速,所以共享所能拥有的网速100k。这里的k可不是我们平时用的k,100kbit大概只能提供12k的下载速度,也就是如同我们拉了一根10M的光纤,实际下载的速度只有1.2M。这个关系也就是除个8这样。

注:htb是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。HTB可以通过TBF(Token Bucket Filter)令牌桶过滤器实现带宽限制,也能够划分类别的优先级。

三,作子类

tc class add dev eth2 parent 2:1 classid 2:50 htb rate 50kbit ceil 50kbit
tc class add dev eth2 parent 2:1 classid 2:100 htb rate 100kbit ceil 100kbit
tc class add dev eth2 parent 2:1 classid 2:20 htb rate 20kbit ceil 20kbit

这三个子类,都进行了限速而且不能借速,如果rate 128kbit ceil 384kbit 速率是128kbit,最高是384kbit,也就是它能借用(384-128)kbit ,但是这里有一点ceil的值最高可不能大于根类的大小。

四,作队列

tc qdisc add dev eth2 parent 2:50 handle 50: sfq perturb 10

tc qdisc add dev eth2 parent 2:100 handle 100: sfq perturb 10

tc qdisc add dev eth2 parent 2:20 handle 20: sfq perturb 10

这里的sfq perturb 10还可能是以下的几种形式:

第一种:[p|b]fifo先进先出只有一个参数:limit. pfifo是以数据包的个数为单位;bfifo是以字节数为单位。如:pfifo limit 2

第二种:red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。

第三种:sfq是Stochastic Fairness Queueing(随机公平队列)的简写。是公平队列算法家族中的一个简单实现.它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。只有当你的出口网卡确实已经挤满了的时候,SFQ才会起作用,SFQ会频繁地改变散列算法,这也是公平的一个方面。sfq的perturb参数指多少秒后重新配置一次散列算法.如果取消设置,散列算法将永远不会重新配置(不建议这样做).10秒应该是一个合适的值:如tc qdisc add dev eth0 parent 2:10 handle 10: sfq perturb 10

第四种:tbf是Token Bucket Filter(令牌桶过滤器)的简写,适合于把流速降低到某个值。这个参数参考tc命令及参数

五,过滤器

tc filter add dev eth2 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.1.50/32 flowid 2:50
tc filter add dev eth2 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.1.100/32 flowid 2:100
tc filter add dev eth2 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.1.0/24 flowid 2:20

这里用u32的过滤器

还有一种是fw形式的过滤器,fw的写法
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11

另个还得在iptables 作fw标志。

一般出外网时才会用fw规则,因为内部IP地址在经过外网卡时会进行NAT,所以不能用源地址进行U32匹配,只能是FW规则进行流量标识。

iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.200/32 -j MARK --set-mark 1

iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.172/32 -j MARK --set-mark 1

iptables -A PREROUTING -t mangle -i eth2 -s 192.168.1.82/32 -j MARK --set-mark 1

tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 1 fw classid 1:20

iptables mark后的值也就是tc fw前的值

但是prio优先级一定不能相同,否则fw规则将失效

因为我没有做上传限速,所以没有用到fw.

这里有没有看到ip的形式是192.168.1.82/32 和192.168.1.0/24。前者表示192.168.1.82这样一个ip,后者却是表示192.168.1这样的一个整个c段的网络地址。

这里的ip不能写成192.168.1.25-82(想表示的意思是从192.168.1.25到192.168.1.82这里的所有ip)。我用了很多的方法,都做不到。如果要这样做的话,我只能用shell里做一个循环。

IPS=2#起始
IPE=253#结束

COUNTER=$IPS
while [ $COUNTER -le $IPE ]

do
语句 $COUNTER
COUNTER=` expr $COUNTER + 1 `
done

还有规则是提到的ip的电脑一起共用所设带宽

配置vsftp支持ssl

ftp传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码,为了搭建一个安全性比较高ftp,可以结合SSL来解决问题
 
SSL(Secure Socket Layer)工作于传输层和应用程序之间.作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证.SSL取得大规模成功后,IETFSSL作了标准化,并将其称为TLS(Transport Layer Security).Ftp结合SSL,将实现传输数据的加密,保证数据不被别人窃取
 
 
让vsftpd支持SSL,必须让OPENSSL≥0.9.6版本,还有就是本身vsftpd版本是否支持
查询vsftpd软件是否支持SSL
[root@localhost vsftpd]# ldd /usr/sbin/vsftpd |grep libssl
        libssl.so.6 => /lib/libssl.so.6 (0xf7f27000)   ==è说明此版本支持
如没有输出libssl.so.6 => /lib/libssl.so.6 (0xf7f27000)类似文本,说明此vsftpd版本不支持SSL


openssl req -x509 -nodes -days 365 -newkey rsa:1024 \-keyout /etc/vsftpd/vsftpd.pem \-out /etc/vsftpd/vsftpd.pem  ==è生成vsftpd.pem 证书

vi /etc/vsftpd/vsftpd.conf  ==è编辑主配置文件,添加以下参数ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
service vsftpd restart

下面是ssl参数一些定义,根据自己需求去修改
ssl_enable=yes/no             //是否启用 SSL,默认为no
allow_anon_ssl=yes/no         //是否允许匿名用户使用SSL,默认为no
rsa_cert_file=/path/to/file       //rsa证书的位置
dsa_cert_file=/path/to/file      //dsa证书的位置
force_local_logins_ssl=yes/no    //非匿名用户登陆时是否加密,默认为yes
force_local_data_ssl=yes/no     //非匿名用户传输数据时是否加密,默认为yes
force_anon_logins_ssl=yes/no    //匿名用户登录时是否加密,默认为no
force_anon_data_ssl=yes/no     //匿名用户数据传输时是否加密,默认为no
ssl_sslv2=yes/no               //是否激活sslv2加密,默认no
ssl_sslv3=yes/no                //是否激活sslv3加密,默认no
ssl_tlsv1=yes/no                //是否激活tls v1加密,默认yes
ssl_ciphers=加密方法            //默认是DES-CBC3-SHA

 

php页面跳转的三种方法详解

1.第一种:
 <?php
header("Location: htto://www.wdlinux.cn");
?>
2.第二种:
和javascrīpt结合起来
  echo   "<script   language=javascript>"; 
  echo "location.href='www.wdlinux.cn';";
  echo   "</script>";
3.第三种:
echo("<meta http-equiv='refresh'content=0;URL='http://www.wdlinux.cn'>"); 

session_register()出错的解决办法

session_register()出错的解决办法
错误提示:warning: unknown(): your script possibly relies on a session side-effect which
existed until php 4.2.3. please be advised that the session extension does not
consider global variables as a source of data, unless register_globals is
enabled. you can disable this functionality and this warning by setting
session.bug_compat_42 or session.bug_compat_warn to off, respectively. in unknown on line 0

1、php4.2以上版本不需要用session_register()注册session变量,直接用:
$_session["string"]=“string";
赋值。
2、用$_session["string"]获取变量值。
3、用$_session["string"][$n]可传递session数组。

两个测试页面:
//a.php
session_start();
echo $_session["x"]++;

//b.php
session_start();
echo $_session["x"];

运行a.php并不断刷新它,看看有什么结果
运行b.php看看能否在页面之间传送结果。
注意:a.php和b.php必须是同一个ie进程!
测试在register_globals = off下进行,一切正常。

wget 参数

wget -cbN

c 续传 b 后台执行 N 更新

-U --user-agent="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CIBA)"

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)

--referer=URL 引用

 

WGet使用
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.

所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完 毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

=================================================================================
wget的使用格式

Usage: wget [OPTION]... [URL]...用wget做站点镜像:
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
# 或者
wget -m http://www.tldp.org/LDP/abs/html/在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
# 或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/代理可以在环境变量或wgetrc文件中设定

# 在环境变量中设定代理
export PROXY=http://211.90.168.94:8080/
# 在~/.wgetrc中设定代理
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/wget各种选项分类列表
==================================================================================

代码:

  $ wget --help

  GNU Wget 1.9.1,非交互式的网络文件下载工具。
  用法: wget [选项]... [URL]...

  长选项必须用的参数在使用短选项时也是必须的。

启动:

  -V, --version 显示 Wget 的版本并且退出。
  -h, --help 打印此帮助。
  -b, -background 启动后进入后台操作。
  -e, -execute=COMMAND 运行‘.wgetrc’形式的命令。

日志记录及输入文件:

  -o, --output-file=文件 将日志消息写入到指定文件中。
  -a, --append-output=文件 将日志消息追加到指定文件的末端。
  -d, --debug 打印调试输出。
  -q, --quiet 安静模式(不输出信息)。
  -v, --verbose 详细输出模式(默认)。
  -nv, --non-verbose 关闭详细输出模式,但不进入安静模式。
  -i, --input-file=文件 下载从指定文件中找到的 URL。
  -F, --force-html 以 HTML 方式处理输入文件。
  -B, --base=URL 使用 -F -i 文件选项时,在相对链接前添加指定的 URL。

下载:

  -t, --tries=次数 配置重试次数(0 表示无限)。
  --retry-connrefused 即使拒绝连接也重试。
  -O --output-document=文件 将数据写入此文件中。
  -nc, --no-clobber 不更改已经存在的文件,也不使用在文件名后
  添加 .#(# 为数字)的方法写入新的文件。
  -c, --continue 继续接收已下载了一部分的文件。
  --progress=方式 选择下载进度的表示方式。
  -N, --timestamping 除非远程文件较新,否则不再取回。
  -S, --server-response 显示服务器回应消息。
  --spider 不下载任何数据。
  -T, --timeout=秒数 配置读取数据的超时时间 (秒数)。
  -w, --wait=秒数 接收不同文件之间等待的秒数。
  --waitretry=秒数 在每次重试之间稍等一段时间 (由 1 秒至指定的 秒数不等)。
  --random-wait 接收不同文件之间稍等一段时间(由 0 秒至 2*WAIT 秒不等)。
  -Y, --proxy=on/off 打开或关闭代理服务器。
  -Q, --quota=大小 配置接收数据的限额大小。
  --bind-address=地址 使用本机的指定地址 (主机名称或 IP) 进行连接。
  --limit-rate=速率 限制下载的速率。
  --dns-cache=off 禁止查找存于高速缓存中的 DNS。
  --restrict-file-names=OS 限制文件名中的字符为指定的 OS (操作系统) 所允许的字符。

目录:

  -nd --no-directories 不创建目录。
  -x, --force-directories 强制创建目录。
  -nH, --no-host-directories 不创建含有远程主机名称的目录。
  -P, --directory-prefix=名称 保存文件前先创建指定名称的目录。
  --cut-dirs=数目 忽略远程目录中指定数目的目录层。

HTTP 选项:

  --http-user=用户 配置 http 用户名。
  --http-passwd=密码 配置 http 用户密码。
  -C, --cache=on/off (不)使用服务器中的高速缓存中的数据 (默认是使用的)。
  -E, --html-extension 将所有 MIME 类型为 text/html 的文件都加上 .html 扩展文件名。
  --ignore-length 忽略“Content-Length”文件头字段。
  --header=字符串 在文件头中添加指定字符串。
  --proxy-user=用户 配置代理服务器用户名。
  --proxy-passwd=密码 配置代理服务器用户密码。
  --referer=URL 在 HTTP 请求中包含“Referer:URL”头。
  -s, --save-headers 将 HTTP 头存入文件。
  -U, --user-agent=AGENT 标志为 AGENT 而不是 Wget/VERSION。
  --no-http-keep-alive 禁用 HTTP keep-alive(持久性连接)。
  --cookies=off 禁用 cookie。
  --load-cookies=文件 会话开始前由指定文件载入 cookie。
  --save-cookies=文件 会话结束后将 cookie 保存至指定文件。
  --post-data=字符串 使用 POST 方法,发送指定字符串。
  --post-file=文件 使用 POST 方法,发送指定文件中的内容。

HTTPS (SSL) 选项:

  --sslcertfile=文件 可选的客户段端证书。
  --sslcertkey=密钥文件 对此证书可选的“密钥文件”。
  --egd-file=文件 EGD socket 文件名。
  --sslcadir=目录 CA 散列表所在的目录。
  --sslcafile=文件 包含 CA 的文件。
  --sslcerttype=0/1 Client-Cert 类型 0=PEM (默认) / 1=ASN1 (DER)
  --sslcheckcert=0/1 根据提供的 CA 检查服务器的证书
  --sslprotocol=0-3 选择 SSL 协议;0=自动选择,
  1=SSLv2 2=SSLv3 3=TLSv1

FTP 选项:

  -nr, --dont-remove-listing 不删除“.listing”文件。
  -g, --glob=on/off 设置是否展开有通配符的文件名。
  --passive-ftp 使用“被动”传输模式。
  --retr-symlinks 在递归模式中,下载链接所指示的文件(连至目录则例外)。

递归下载:

  -r, --recursive 递归下载。
  -l, --level=数字 最大递归深度(inf 或 0 表示无限)。
  --delete-after 删除下载后的文件。
  -k, --convert-links 将绝对链接转换为相对链接。
  -K, --backup-converted 转换文件 X 前先将其备份为 X.orig。
  -m, --mirror 等效于 -r -N -l inf -nr 的选项。
  -p, --page-requisites 下载所有显示完整网页所需的文件,例如图像。
  --strict-comments 打开对 HTML 备注的严格(SGML)处理选项。

递归下载时有关接受/拒绝的选项:

  -A, --accept=列表 接受的文件样式列表,以逗号分隔。
  -R, --reject=列表 排除的文件样式列表,以逗号分隔。
  -D, --domains=列表 接受的域列表,以逗号分隔。
  --exclude-domains=列表 排除的域列表,以逗号分隔。
  --follow-ftp 跟随 HTML 文件中的 FTP 链接。
  --follow-tags=列表 要跟随的 HTML 标记,以逗号分隔。
  -G, --ignore-tags=列表 要忽略的 HTML 标记,以逗号分隔。
  -H, --span-hosts 递归时可进入其它主机。
  -L, --relative 只跟随相对链接。
  -I, --include-directories=列表 要下载的目录列表。
  -X, --exclude-directories=列表 要排除的目录列表。
  -np, --no-parent 不搜索上层目录。
 

=================================================================================
 wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就结合具体的例子来说明一下wget的用法。
    1、下载整个http或者ftp站点。
    wget http://place.your.url/here
    这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。

    wget -r http://place.your.url/here
    这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定下载的层次。例如只下载两层,那么使用-l 2。

    要是您想制作镜像站点,那么可以使用-m参数,例如:wget -m http://place.your.url/here
    这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。

    2、断点续传。
    当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
    wget -c http://the.url.of/incomplete/file
    使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。

    3、批量下载。
    如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)

    4、选择性的下载。
    可以指定让wget只下载一类文件,或者不下载什么文件。例如:
    wget -m --reject=gif http://target.web.site/subdirectory
    表示下载http://target.web.site/subdirectory,但是忽略gif文件。--accept=LIST 可以接受的文件类型,--reject=LIST拒绝接受的文件类型。

    5、密码和认证。
    wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
    --http-user=USER设置HTTP用户
    --http-passwd=PASS设置HTTP密码
    对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。

    6、利用代理服务器进行下载。
    如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
    http-proxy = 111.111.111.111:8080
    ftp-proxy = 111.111.111.111:8080
    分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
    --proxy-user=USER设置代理用户
    --proxy-passwd=PASS设置代理密码
    这两个参数。
    使用参数--proxy=on/off 使用或者关闭代理。
    wget还有很多有用的功能,需要用户去挖掘。

通过 ulimit 改善系统性能

ulimit 功能简述

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。


图 1. ulimit 的使用

在下面的章节中,将详细介绍如何使用 ulimit 做相应的资源限制。

如何使用 ulimit

ulimit 通过一些参数选项来管理不同种类的系统资源。在本节,我们将讲解这些参数的使用。

ulimit 命令的格式为:ulimit [options] [limit]

具体的 options 含义以及简单示例可以参考以下表格。


表 1. ulimit 参数说明

选项 [options] 含义 例子
-H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

 

我们可以通过以下几种方式来使用 ulimit:

  • 在用户的启动脚本中

    如果用户使用的是 bash,就可以在用户的目录下的 .bashrc 文件中,加入 ulimit – u 64,来限制用户最多可以使用 64 个进程。此外,可以在与 .bashrc 功能相当的启动脚本中加入 ulimt。

  • 在应用程序的启动脚本中

    如果用户要对某个应用程序 myapp 进行限制,可以写一个简单的脚本 startmyapp。

    ulimit – s 512 
     myapp

    以后只要通过脚本 startmyapp 来启动应用程序,就可以限制应用程序 myapp 的线程栈大小为 512K。

  • 直接在控制台输入
    user@tc511-ui:~>ulimit – p 256

    限制管道的缓冲区为 256K。


用户进程的有效范围

ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。举例来说,如果用户同时运行了两个 shell 终端进程,只在其中一个环境中执行了 ulimit – s 100,则该 shell 进程里创建文件的大小收到相应的限制,而同时另一个 shell 终端包括其上运行的子程序都不会受其影响:


Shell 进程 1

ulimit – s 100 
 cat testFile > newFile 
 File size limit exceeded



Shell 进程 2

cat testFile > newFile 
 ls – s newFile 
 323669 newFile

 

那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,方法是通过修改系统的 /etc/security/limits 配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:

<domain> <type> <item> <value>

 

domain 表示用户或者组的名字,还可以使用 * 作为通配符。Type 可以有两个值,soft 和 hard。Item 则表示需要限定的资源,可以有很多候选值,如 stack,cpu,nofile 等等,分别表示最大的堆栈大小,占用的 cpu 时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制。例如:

* hard noflle 100

 

该行配置语句限定了任意用户所能创建的最大文件数是 100。

现在已经可以对进程和用户分别做资源限制了,看似已经足够了,其实不然。很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改 /proc 下的配置文件。/proc 目录下包含了很多系统当前状态的参数,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。


ulimit 管理系统资源的例子

ulimit 提供了在 shell 进程中限制系统资源的功能。本章列举了一些使用 ulimit 对用户进程进行限制的例子,详述了这些限制行为以及对应的影响,以此来说明 ulimit 如何对系统资源进行限制,从而达到调节系统性能的功能。

使用 ulimit 限制 shell 的内存使用

在这一小节里向读者展示如何使用 – d,– m 和 – v 选项来对 shell 所使用的内存进行限制。

首先我们来看一下不设置 ulimit 限制时调用 ls 命令的情况:


图 2. 未设置 ulimit 时 ls 命令使用情况

大家可以看到此时的 ls 命令运行正常。下面设置 ulimit:

>ulimit -d 1000 -m 1000 -v 1000

 

这里再温习一下前面章节里介绍过的这三个选项的含义:

-d:设置数据段的最大值。单位:KB。

-m:设置可以使用的常驻内存的最大值。单位:KB。

-v:设置虚拟内存的最大值。单位:KB。

通过上面的 ulimit 设置我们已经把当前 shell 所能使用的最大内存限制在 1000KB 以下。接下来我们看看这时运行 ls 命令会得到什么样的结果:

haohe@sles10-hehao:~/code/ulimit> ls test -l 
 /bin/ls: error while loading shared libraries: libc.so.6: failed to map segment 
 from shared object: Cannot allocate memory

 

从上面的结果可以看到,此时 ls 运行失败。根据系统给出的错误信息我们可以看出是由于调用 libc 库时内存分配失败而导致的 ls 出错。那么我们来看一下这个 libc 库文件到底有多大:


图 3. 查看 libc 文件大小

从上面的信息可以看出,这个 libc 库文件的大小是 1.5MB。而我们用 ulimit 所设置的内存使用上限是 1000KB,小于 1.5MB,这也就充分证明了 ulimit 所起到的限制 shell 内存使用的功能。

使用 ulimit 限制 shell 创建的文件的大小

接下来向读者展示如何使用 -f 选项来对 shell 所能创建的文件大小进行限制。

首先我们来看一下,没有设置 ulimit -f 时的情况:


图 4. 查看文件

现有一个文件 testFile 大小为 323669 bytes,现在使用 cat 命令来创建一个 testFile 的 copy:


图 5. 未设置 ulimit 时创建复本

从上面的输出可以看出,我们成功的创建了 testFile 的拷贝 newFile。

下面我们设置 ulimt – f 100:

> ulimit -f 100

 

-f 选项的含义是:用来设置 shell 可以创建的文件的最大值。单位是 blocks。

现在我们再来执行一次相同的拷贝命令看看会是什么结果:


图 6. 设置 ulimit 时创建复本

这次创建 testFile 的拷贝失败了,系统给出的出错信息时文件大小超出了限制。在 Linux 系统下一个 block 的默认大小是 512 bytes。所以上面的 ulimit 的含义就是限制 shell 所能创建的文件最大值为 512 x 100 = 51200 bytes,小于 323669 bytes,所以创建文件失败,符合我们的期望。这个例子说明了如何使用 ulimit 来控制 shell 所能创建的最大文件。

使用 ulimit 限制程序所能创建的 socket 数量

考虑一个现实中的实际需求。对于一个 C/S 模型中的 server 程序来说,它会为多个 client 程序请求创建多个 socket 端口给与响应。如果恰好有大量的 client 同时向 server 发出请求,那么此时 server 就会需要创建大量的 socket 连接。但在一个系统当中,往往需要限制单个 server 程序所能使用的最大 socket 数,以供其他的 server 程序所使用。那么我们如何来做到这一点呢?答案是我们可以通过 ulimit 来实现!细心的读者可能会发现,通过前面章节的介绍似乎没有限制 socket 使用的 ulimit 选项。是的,ulimit 并没有哪个选项直接说是用来限制 socket 的数量的。但是,我们有 -n 这个选项,它是用于限制一个进程所能打开的文件描述符的最大值。在 Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。在 Linux 下创建一个新的 socket 连接,实际上就是创建一个新的文件描述符。如下图所示(查看某个进程当前打开的文件描述符信息):


图 7. 查看进程打开文件描述符

因此,我们可以通过使用 ulimit – n 来限制程序所能打开的最大文件描述符数量,从而达到限制 socket 创建的数量。

使用 ulimit 限制 shell 多线程程序堆栈的大小(增加可用线程数量)

在最后一个例子中,向大家介绍如何使用 -s(单位 KB)来对线程的堆栈大小进行限制,从而减少整个多线程程序的内存使用,增加可用线程的数量。这个例子取自于一个真实的案例。我们所遇到的问题是系统对我们的多线程程序有如下的限制:

ulimit -v 200000

根据本文前面的介绍,这意味着我们的程序最多只能使用不到 200MB 的虚拟内存。由于我们的程序是一个多线程程序,程序在运行时会根据需要创建新的线程,这势必会增加总的内存需求量。一开始我们对堆栈大小的限制是 1024 (本例子中使用 1232 来说明):

# ulimit – s 1232

 

当我们的程序启动后,通过 pmap 来查看其内存使用情况,可以看到多个占用 1232KB 的数据段,这些就是程序所创建的线程所使用的堆栈:


图 8. 程序线程所使用的堆栈

每当一个新的线程被创建时都需要新分配一段大小为 1232KB 的内存空间,而我们总的虚拟内存限制是 200MB,所以如果我们需要创建更多的线程,那么一个可以改进的方法就是减少每个线程的固定堆栈大小,这可以通过 ulimit – s 来实现:

# ulimit -s 512

 

我们将堆栈大小设置为 512KB,这时再通过 pmap 查看一下我们的设置是否起作用:


图 9. 设置 ulimit 后堆栈大小

从上面的信息可以看出,我们已经成功的将线程的堆栈大小改为 512KB 了,这样在总内存使用限制不变的情况下,我们可以通过本小节介绍的方法来增加可以创建的线程数,从而达到改善程序的多线程性能。

 

总结

综上所述,linux 系统中的 ulimit 指令,对资源限制和系统性能优化提供了一条便捷的途径。从用户的 shell 启动脚本,应用程序启动脚本,以及直接在控制台,都可以通过该指令限制系统资源的使用,包括所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存,等等方面。本文中的示例非常直观的说明了 ulimit 的使用及其产生的效果,显而易见,ulimit 对我们在 Linux 平台的应用和开发工作是非常实用的。

特别感谢

贺皓为本篇文章的撰写提出了很多建议,做了大量实验,提供了文章中的实验数据和结论。

贺皓是 IBM CSTL(中国系统与科技开发中心)的软件工程师。他在复旦大学获得了计算机科学专业的学士与硕士学位。目前他在 IBM SVC Agent 开发小组从事研发工作。

squid 访问控制

访问控制
访问控制元素
ACL元素是Squid的访问控制的基础。基本的ACL元素语法如下:

acl name type value1 value2 ...例如:

acl Workstations src 10.0.0.0/16

    acl Http_ports port 80 8000 8080   基本的ACL类型
IP地址
使用对象:src,dst,myip

    squid在ACL里指定IP地址时,能以子网,地址范围,域名等形式编写地址。假如你忽略掩码,squid会自动计算相应的掩码。如下: acl Foo src 127.0.0.1/32,通过指定地址范围做到列举多个相邻子网。例如:acl Bar src 172.16.10.0-172.16.19.0/24.     注意使用IP地址范围,掩码只能取一个。也能在IP ACL里指定主机名,启动时,将主机名转换成IP地址。(一旦启动,squid不会对主机名的地址发起第二次DNS查询。这样,假如在squid运行中地址已改变,squid不会注意到)。假如主机名被解析成多个IP地址,squid将每一个增加到ACL里。注意你也可以对主机名使用网络掩码。

ACL主机名转换到IP地址的过程会延缓squid的启动。除非绝对必要,请在src,dst,和myip ACL里避免使用主机名。

squid以一种叫做splay tree的数据结构在内存里存储IP地址ACL。splay tree有自我调整的特性,其中之一是在查询发生时,列表会自动纠正它自己的位置。当某个匹配元素在列表里发现时,该元素变成新的树根。在该方法中,最近参考的条目会移动到树的顶部,这减少了将来查询的时间。

属于同一ACL元素的所有的子网和范围不能重迭。例如,如下不被允许:

        acl Foo src 1.2.3.0/24        acl Foo src 1.2.3.4/32它导致squid在cache.log里打印警告:

域名
使用对象:srcdomain,dstdomain,和cache_host_domain指令

当ACL域名以"."开头,squid将它作为通配符,相反,如果ACL域名不以"."开头,squid使用精确的字符串比较。squid使用splay tree的数据结构来存储域名ACL.

用户名
使用对象:ident,proxy_auth

用户名必须被严格匹配。squid也有相关的ACL对用户名使用正则表达式匹配(ident_regex和proxy_auth_regex)。你可以使用单词"REQUIRED"作为特殊值去匹配任意用户名。

正则表达式
使用对象:srcdom_regex, dstdom_regex, url_regex, urlpath_regex, browser, referer_regex, ident_regex, proxy_auth_regex, req_mime_type, rep_mime_type

大量的ACL使用正则表达式来匹配字符串。最常使用的正则表达式功能用以匹配字符串的开头或结尾。例如,^字符匹配行或字符串的开头,$是匹配行或字符串的结尾,.字符是匹配任意单个字符的通配符,对所有的squid正则表达式类,匹配是默认大小写敏感的。为了大小写不敏感,在ACL类型后面使用-i选项。

TCP端口号
使用对象:port,myport

该类型是相对的,值是个别的端口号或端口范围。如下示例:

        acl Foo port 123            acl Bar port 1-1024自主系统号
使用对象:src_as,dst_as

Internet路由器使用自主系统(AS)号来创建路由表。基本上,某个AS号指向被同一组织管理的IP网络范围。例如,我的ISP分配了如下网络块:134.116.0.0/16, 137.41.0.0/16, 206.168.0.0/16,和其他更多。在Internet路由表里,这些网络被公布为属于AS 3404。当路由器转发包时,它们典型的选择经过最少AS的路径。AS基础的ACL仅仅被网络gurus使用。

 

ACL类型
src
使用IP地址来控制客户允许或不允许访问Squid。src类型指客户源IP地址。

acl MyNetwork src 192.168.0.0 10.0.1.0/24 10.0.5.0/24 172.16.0.0/12

dst
dst类型指向原始服务器(目标)IP地址。在某些情况下,能使用该类型来阻止用户访问特定web站点。然而,在使用dst ACL时须谨慎。大部分squid接受到的请求有原始服务器主机名.

请注意,为了避免延时,该尽可能的使用dstdomain ACL类型来代替dst, dst ACL存在的问题是,你试图允许或拒绝访问的原始服务器可能会改变它的IP地址。假如你不关心这样的改变,那就不必麻烦去升级squid.conf。你可以在acl行里放上主机名,但那样会延缓启动速度。假如你的ACL需要许多主机名,你也许该预处理配置文件,将主机名转换成IP地址。

myip
myip类型指Squid的IP地址,它被客户连接。所以该ACL元素仅仅当系统有多个IP地址时才有用。

请注意,使用该机制你必须特别小心,阻止来自某个子网的用户连接squid位于另一子网的IP地址。否则,在会计和市场子网的聪明的用户,能够通过技术部子网进行连接,从而绕过你的限制。

dstdomain
使用它们去阻塞对某些站点的访问,去控制squid如何转发请求,以及让某些响应不可缓存,如下两行的不同:

        acl A dst www.squid-cache.org        acl B dstdomain www.squid-cache.orgA实际上是IP地址ACL,假如在squid运行时IP地址改变了,squid会继续使用旧的地址。然而dstdomain ACL以域名形式存储,并非IP地址。当squid检查ACL B时,它对URL的主机名部分使用字符串比较功能,它并不真正关心是否www.squid-cache.org的IP地址改变了。

使用dstdomain ACL的主要问题是某些URL使用IP地址代替主机名。

srcdomain
srcdomain要求对每个客户IP地址进行所谓的反向DNS查询。使用dst ACL,FQDN查询会导致延时。请求会被延缓处理直到FQDN响应返回。FQDN响应被缓存下来,所以srcdomain查询通常仅在客户首次请求时延时。srcdomain查询有时不能工作。许多组织并没有保持他们的反向查询数据库与日更新,在该情形下,请求可能会延时非常长时间,直到DNS查询超时。

    假如你使用srcdomain ACL,请确认你自己的DNS in-addr.arpa区域配置正确并且在工作中。port
使用port ACL来限制对某些原始服务器端口号的访问,port ACL允许你定义单独的端口或端口范围。例如:acl HTTPports port 80 8000-8010 8080

myport
port ACL指向原始服务器的端口号,myport指向squid自己的端口号,用以接受客户请求。假如在http_port指令里指定不止一个端口号,那么squid就可以在不同的端口上侦听。

假如将squid作为站点HTTP加速器和用户代理服务器,可以在80上接受加速请求,在3128上接受代理请求。想让所有人访问加速器,但仅仅你自己的用户能以代理形式访问squid。ACL可能如下:

        acl AccelPort myport 80        acl ProxyPort myport 3128        acl MyNet src 172.16.0.0/22        http_access allow AccelPort         # anyone        http_access allow ProxyPort MyNet   # only my users        http_access deny ProxyPort          # deny othersmethod
method ACL指HTTP请求方法,如:acl Uploads method PUT POST.

Squid知道下列标准HTTP方法:GET, POST, PUT, HEAD, CONNECT, TRACE, OPTIONS和DELETE。另外,来自WEBDAV规范,RFC 2518的方法:PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK。还有非标准的WEBDAV方法: BMOVE, BDELETE, BPROPFIND。最后,你可以在extension_methods指令里配置squid去理解其他的请求方法。

注意CONNECT方法非常特殊。它是用于通过HTTP代理来封装某种请求的方法。在处理CONNECT方法和远程服务器的端口号时应特别谨慎。如你不希望squid连接到某些远程服务。你该限制CONNECT方法仅仅能连接到HTTPS/SSL或NNTPS端口(443和563)。默认的squid.conf这样做:

        acl CONNECT method CONNECT        acl SSL_ports 443 563        http_access allow CONNECT SSL_ports        http_access deny CONNECT在该配置里,squid仅仅允许加密请求到端口443(HTTPS/SSL)和563(NNTPS)。CONNECT方法对其他端口的请求都被拒绝。

PURGE是另一个特殊的请求方法。它是Squid的专有方法,它让管理员能强制删除缓存对象。

proto
该类型指URI访问(或传输)协议。有效值:http, https (same as HTTP/TLS), ftp, gopher, urn, whois, 和cache_object。例如拒绝所有的FTP请求:

        acl FTP proto FTP        http_access deny FTPcache_object机制是squid的特性。它用于访问squid的缓存管理接口。默认的squid.conf文件有许多行限制缓存管理访问:

        acl Manager proto cache_object        acl Localhost src 127.0.0.1        http_access allow Manager Localhost        http_access deny Manager这些配置行仅允许来自本机地址的缓存管理请求,所有其他的缓存管理请求被拒绝。这意味着在squid机器上有帐号的人,能访问到潜在的敏感缓存管理信息。

time
time ACL允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以24小时制来表示。开始时间必须小于结束时间。

Code
 Day
 
S
 Sunday
 
M
 Monday
 
T
 Tuesday
 
W
 Wednesday
 
H
 Thursday
 
F
 Friday
 
A
 Saturday
 
D
 All weekdays (M-F)
 

 

日期和时间由localtime()函数来产生。

时间跨越子夜,你需要把它们分成两个ACL来写,或者使用否定机制来定义非忙时。例如:

        acl Offpeak1 20:00-23:59        acl Offpeak2 00:00-04:00        http_access allow Offpeak1 ...        http_access allow Offpeak2 ...另外,你可以这样写:

        acl Peak 04:00-20:00        http_access allow !Peak ...不应该在同一个time ACL里放置多个日期和时间范围列表。例如,假如你输入:acl Blah time M 08:00-10:00 W 09:00-11:00,实际能做到的是:acl Blah time MW 09:00-11:00,解析仅仅使用最后一个时间范围。正确的写法是,将它们写进两行:

        acl Blah time M 08:00-10:00        acl Blah time W 09:00-11:00ident
ident ACL匹配被ident协议返回的用户名。

ident ACL可以对你的用户请求造成延时,推荐仅仅在本地局域网中,并且大部分客户工作站运行ident服务时,才使用ident ACL。

注意ident协议不是很安全;squid也有个对客户端执行懒惰ident查询。在该情形下,在等待ident查询时,请求不会延时。

proxy_auth
squid支持HTTP代理验证功能。使用代理验证,客户的包括头部的http请求包含了验证信用选项。squid解密信用选项,并调用外部验证程序以发现该信用选项是否有效。

squid当前支持三种技术以接受用户验证:HTTP基本协议,数字认证协议,和NTLM。基本认证是非常不安全的技术,以明文同时发送。数字认证更安全,但也更复杂。NTLM也比基本认证更安全,然而它是Microsoft发展的专有协议。

为了使用代理验证,你必须配置squid使用大量的外部辅助程序,auth_param指令控制对所有辅助程序的配置。

    auth_param指令和proxy_auth ACL是少数在配置文件里顺序重要的实例。你必须在proxy_auth ACL之前定义至少一个验证辅助程序(使用auth_param)。代理验证不支持HTTP拦截,因为用户代理不知道它在与代理服务器,而非原始服务器通信。

src_as
该类型检查客户源IP地址所属的具体AS号。例如,我们虚构某ISP使用AS 64222并且通告使用10.0.0.0/8,172.16.0.0/12,192.168.0.0/16网络。你可以编写这样的ACL,它允许来自该ISP地址空间的任何主机请求:

        acl TheISP src 10.0.0.0/8        acl TheISP src 172.16.0.0/12        acl TheISP src 192.168.0.0/16        http_access allow TheISP当然,可以这样写:

        acl TheISP src_as 64222        http_access allow TheISPdst_as
dst_as ACL经常与cache_peer_access指令一起使用。在该方法中,squid使用与IP路由一致的方式转发cache丢失。

snmp_community
snmp_community ACL对SNMP查询才有意义,后者被snmp_access指令控制。例如:

        acl OurCommunityName snmp_community hIgHsEcUrItY        acl All src 0/0        snmp_access allow OurCommunityName        snmp_access deny All在该情况中,假如community名字设置为hIgHsEcUrItY,SNMP查询才被允许。

maxconn
maxconn ACL指来自客户IP地址的大量同时连接。某些squid管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。

arp
arp ACL用于检测cache客户端的MAC地址(以太网卡的物理地址)。该特性使用非移植性代码。运行./configure时增加--enable-arp-acl选项,就可以激活该功能。

arp ACL有另一个重要限制。客户主机和squid在同一子网,它才能工作。在squid和你的用户之间有路由器存在,你可能不能使用arp ACL。

srcdom_regex
srcdom_regex ACL允许你使用正则表达式匹配客户域名。限制是:某些客户地址不能反向解析到域名。

dstdom_regex
dstdom_regex ACL也与dstdomain相似。下面的例子匹配以www开头的主机名:acl WebSite dstdom_regex -i ^www\.如下是另一个有用的正则表达式,用以匹配在URL主机名里出现的IP地址:acl IPaddr dstdom_regex [0-9]$

url_regex
url_regex ACL用于匹配请求URL的任何部分,包括传输协议和原始服务器主机名。例如,如下ACL匹配从FTP服务器的MP3文件请求:

        acl FTPMP3 url_regex -i ^ftp://.*\.mp3$urlpath_regex
urlpath_regex与url_regex非常相似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测非常容易。例如,假设你必须拒绝URL里的"sex",但仍允许在主机名里含有"sex"的请求,那么这样做:

        acl Sex urlpath_regex sexbrowser
browser ACL对user-agent头执行正则表达式匹配。例如,拒绝不是来自Mozilla浏览器的请求,可以这样写:

        acl Mozilla browser Mozilla        http_access deny !Mozillareq_mime_type
req_mime_type ACL指客户HTTP请求里的Content-Type头部。该类型头部通常仅仅出现在请求消息主体里。req_mime_type ACL值是正则表达式。你可以这样编写ACL去捕获音频文件类型:acl AuidoFileUploads req_mime_type -i ^audio/

rep_mime_type
该类型ACL指原始服务器的HTTP响应里的Content-Type头部。它仅在使用http_reply_access规则时才有用。假如你想使用squid阻塞Java代码,你可以这样写:

        acl JavaDownload rep_mime_type application/x-java        http_reply_access deny JavaDownloadident_regex
ident_regex允许你使用正则表达式,代替严格的字符串匹配,这些匹配是对ident协议返回的用户名进行。例如,如下ACL匹配包含数字的用户名:acl NumberInName ident_regex [0-9]

proxy_auth_regex
该ACL允许对代理认证用户名使用正则表达式。例如,如下ACL匹配admin,administrator和administrators:

acl Admins proxy_auth_regex -i ^admin

 

外部ACL
外部ACL:可以指示squid发送某些信息片断到外部进程,然后外部的辅助程序告诉squid,数据匹配或不匹配。

external_acl_type指令定义新的外部ACL类型。通用语法:

    external_acl_type type-name [options] format helper-commandtype-name是用户定义的字串。

Squid当前支持如下选项(options):

        ttl=n:用以缓存匹配值的时间长短。        negative_ttl=n:用以缓存不匹配值的时间长短。        concurrency=n:衍生的辅助程序的数量。        cache=n:缓存结果的最大数量。 格式是以%字符开始的一个或多个关键字。squid当前支持如下格式:        %LOGIN:从代理验证信用选项里获取的用户名。        %IDENT:从RFC 1413 ident获取的用户名。        %SRC:客户端IP地址。        %DST:原始服务器IP地址。        %PROTO:传输协议(例如HTTP,FTP等)        %PORT:原始服务器的TCP端口。        %METHOD:HTTP请求方法。        %{Header}:HTTP请求头部的值;        %{Hdr:member}:选择某些数量的基于列表的HTTP头部可以在这里包含命令参数。例如,整条命令可能类似如此:

 /usr/local/squid/libexec/my-acl-prog.pl -X -5 /usr/local/squid/etc/datafile将这些放在一个长行里。squid不支持如下通过反斜杠分隔长行的技术,所以请记住所有这些必须放在单行里

编写引用它的acl行。这相对容易,语法如下:

        acl acl-name external type-name [args ...]如下是个简单示例:

        acl MyAcl external MyAclTypesquid接受在type-name后面的任意数量的参数。

 

处理长ACL列表
从外部文件里包含ACL列表。语法:acl name "filename"

这里的双引号指示squid打开filename,并且将它里面的内容分配给ACL。文件可以包含以#开头的注释。注意在该文件里的每个IP地址必须是一个单独的行。acl行里的任何地方,以空格来分隔值,新行是包含ACL值的文件的分界。

 

Squid如何匹配访问控制元素
squid在检查ACL元素值时使用OR逻辑。当squid找到第一个值匹配时,它停止搜索。这意味着把最可能匹配的值放在列表开头处,能减少延时。

 

访问控制规则
squid有大量其他的访问控制列表:

http_access:它决定哪些客户HTTP请求被允许,和哪些被拒绝。

http_reply_access:基于响应内容类型来允许或拒绝请求。 icp_access:squid被配置来服务ICP响应,那么该使用icp_access列表。 no_cache:使用no_cache访问列表来指示squid,它不必存储某些响应(在磁盘或内存里)。 miss_access:主要用于squid的邻居cache。它决定squid怎样处理cache丢失的请求。如果squid使用集群技术,那么该功能必需。 redirector_access:该访问列表决定哪个请求被发送到重定向进程。可以使用redirector_access列表来阻止某些请求被重写。 ident_lookup_access: ident_lookup_access列表与redirector_access类似。它允许你对某些请求执行懒惰ident查询。 always_direct: 该访问列表影响squid怎样处理与邻居cache转发cache丢失。never_direct: never_direct与always_direct相反。匹配该列表的cache丢失请求必须发送到邻居cache。 snmp_access: 该访问列表应用到发送给squid的SNMP端口的查询。 broken_posts: 该访问列表影响squid处理某些POST请求的方法。 cache_peer_access: 该访问列表控制发送到邻居cache的HTTP请求和ICP/HTCP查询。 reply_body_max_size: 该访问列表限制对HTTP响应主体的最大可接受size。 delay_access: 该访问规则列表控制是否延时池被应用到某个请求的cache丢失响应。 tcp_outgoing_address: 该访问列表绑定服务端TCP连接到指定的本地IP地址。 tcp_outgoing_tos: 该访问列表能设置到原始服务器和邻居cache的TCP连接的不同TOS/Diffserv值。 header_access: 使用该指令,你能配置squid从它转发的请求里删除某些HTTP头部。 header_replace: 该指令允许你替换,而不是删除,HTTP头部的内容。

 

访问规则语法
访问控制规则的语法如下:

access_list allow|deny [!]ACLname ...将最常用的ACL放在列表的开始位置,可以减少squid的CPU负载。

请谨慎的编写always_direct,never_direct,和no_cache规则。在always_direct中,allow规则意味着匹配的请求直接转发到原始服务器。always_direct deny规则意味着匹配的请求不强迫发送到原始服务器,但假如邻居cache不可到达,那可能还是会这么做。no_cache规则也有点麻烦。这里,你必须对不必被cache的请求使用deny。

 

 

如何匹配访问规则
squid在搜索ACL元素时使用的“或”逻辑。访问规则恰好相反,squid使用“与”逻辑。如下示例:

access_list allow ACL1 ACL2 ACL3对该匹配规则来说,请求必须匹配ACL1,ACL2,ACL3中的任何一个。

对某个规则来说,将最少匹配的ACL放在首位,能使效率最佳。考虑如下示例:

假如最后的规则是deny规则,默认动作是允许请求。在访问列表的最后加上一条,明确允许或拒绝所有请求,是好的实际做法。src 0/0 ACL表示匹配每一个和任意类型的请求。

 

 

访问列表风格
该将更具体的和受限制的访问列表放在首位。无论何时,你编写了一个带两个或更多ACL元素的规则,建议你在其后紧跟一条相反的,更广泛的规则。

延时检查
当squid遇到某个ACL不能被检查时,它延迟决定并且发布对必要信息的查询(IP地址,域名,用户名等)。当信息可用时,squid再次在列表的开头位置检查这些规则。它不会从前次检查剩下的位置继续。假如可能,你应该将这些最可能被延时的ACL放在规则的顶部,以避免不必要的,重复的检查。

 

减缓和加速规则检查
下列访问规则被快速检查:

header_accessreply_body_max_sizereply_accessident_lookupdelay_accessmiss_accessbroken_postsicp_accesscache_peer_accessredirector_accesssnmp_access