dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
1. 命令简介
dd 的主要选项:
指定数字的地方若以下列字符结尾乘以相应的数字:
b=512, c=1, k=1024, w=2, xm=number m
if=file
输入文件名,缺省为标准输入。
of=file
输出文件名,缺省为标准输出。
ibs=bytes
一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
obs=bytes
一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
bs=bytes
同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
cbs=bytes
一次转换 bytes 个字节,即转换缓冲区大小。
skip=blocks
从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks
从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
count=blocks
仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
conv=conversion[,conversion...]
用指定的参数转换文件。
转换参数:
ascii 转换 EBCDIC 为 ASCII。
ebcdic 转换 ASCII 为 EBCDIC。
ibm 转换 ASCII 为 alternate EBCDIC.
block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
unblock 使每一行的长度都为 cbs ,不足部分用空格填充。
lcase 把大写字符转换为小写字符。
ucase 把小写字符转换为大写字符。
swab 交换输入的每对字节。
noerror 出错时不停止。
notrunc 不截短输出文件。
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
2.实例分析
2.1.数据备份与恢复
2.1.1整盘数据备份与恢复
备份:
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
恢复:
[Copy to clipboard] [ - ]
CODE:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘
[Copy to clipboard] [ - ]
CODE:
gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘
2.1.2.利用netcat远程备份
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda
[Copy to clipboard] [ - ]
CODE:
netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc
[Copy to clipboard] [ - ]
CODE:
netcat -l -p 1234 | bzip2 > partition.img
netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。
2.1.3.备份MBR
备份:
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件
恢复:
[Copy to clipboard] [ - ]
CODE:
dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分
2.1.4.备份软盘
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件
2.1.5.拷贝内存资料到硬盘
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件
2.1.6.从光盘拷贝iso镜像
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
2.2.增加Swap分区文件大小
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)
[Copy to clipboard] [ - ]
CODE:
mkswap /swapfile
把这个文件变成swap文件
[Copy to clipboard] [ - ]
CODE:
swapon /swapfile
启用这个swap文件
[Copy to clipboard] [ - ]
CODE:
/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行
2.3.销毁磁盘数据
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。
2.4磁盘管理
2.4.1.得到最恰当的block size
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
2.4.2测试硬盘读写速度
[Copy to clipboard] [ - ]
CODE:
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
2.4.3.修复硬盘
[Copy to clipboard] [ - ]
CODE:
dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。>
引用地址:
注意: 该地址仅在今日23:59:59之前有效
文介绍手工为FreeBSD添加新硬盘的一般性方法。假设我们的FreeBSD已经有了一块IDE硬盘,我们需要为它添加一块新的IDE硬盘,并把新添加的硬盘的所有空间作为一个分区加载到/disk1下面。
基础知识
FreeBSD分区描述符为从"a"到"h"的8个字母。根据惯例,分区"c"被保留用作描述整个磁盘,"a"用作标识根分区,"b"用作标识交换分区。对于新添加的硬盘,我们常常只建立一个分区,标识为"e"。
IDE硬盘标记为ad,而SCSI硬盘标记为da,从0开始计数,因此,我们新添加的IDE硬盘将作为ad1出现在系统中。
一般步骤
把新的IDE硬盘接入系统,并确认开机以后系统找到了新添加的硬盘。可以通过检查/var/run/dmesg.boot来确认系统是否找到新添加的硬盘。
准备
vms# dd if=/dev/zero of=/dev/rad1 bs=1k count=1
1+0 records in
1+0 records out
1024 bytes transferred in 0.000822 secs (1245640 bytes/sec)
vms#
初始化磁盘
vms# fdisk -BI ad1
******* Working on device /dev/ad1 *******
fdisk: invalid fdisk partition table found
vms#
建立FreeBSD分区
vms# disklabel -B -w -r ad1s1 auto
vms# Feb 23 14:01:40 /kernel: ad1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1s1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1s1: cannot find label (no disk label)
vms#
建立逻辑分区
vms# disklabel -e ad1s1
type: unknown
disk: amnesiac
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 18931
sectors/unit: 19083393
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 19083393 0 unused 0 0 # (Cyl. 0 - 18931*)
e: 19083393 0 4.2BSD 4096 8192 16 # (Cyl. 0 - 18931*)
格式化分区,创建文件系统
vms# newfs /dev/ad1s1e
Warning: Block size and bytes per inode restrict cylinders per group to 67.
Warning: 3968 sector(s) in last cylinder unallocated
/dev/ad1s1e: 19083392 sectors in 4660 cylinders of 1 tracks, 4096 sectors
9318.1MB in 70 cyl groups (67 c/g, 134.00MB/g, 8512 i/g)
super-block backups (for fsck -b #) at:
32, 274464, 548896, 823328, 1097760, 1372192, 1646624, 1921056, 2195488, 2469920, 2744352, 3018784, 3293216, 3567648,
3842080, 4116512, 4390944, 4665376, ...
加载分区
vms# mkdir -p /disk1
vms# mount -t ufs /dev/ad1s1e /disk1
引用地址:
注意: 该地址仅在今日23:59:59之前有效
学习了HTTP信息头,知道了很多文件的类型是如何被服务器识别,并做出相应的反应的。
1. HTTP消息头
(1)通用信息头
即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma
主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade
(2)请求头
用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的Cookie信息和发出该请求的超链接源地址等.
主要: Accept , Accept-Encoding , Accept-Language , Host ,
(3)响应头
用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等.
主要: Location , Server , WWW-Authenticate(认证头)
(4)实体头
用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等.
主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type
(4)扩展头
主要:Refresh, Content-Disposition
2. 几个主要头的作用
(1)Content-Type的作用
该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。
例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.
(2)Content-Disposition 的作用
当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
解决中文文件名乱码的解决方法,平常想的是使用getBytes() , 实际上应使用email的附件名编码方法对文件名进行编码,但IE不支持这种作法(其它浏览器支持) , 使用javax.mail.internet.*包的MimeUtility.encodeWord("中文.txt")的方法进行编码。
Content-Disposition扩展头的例子:
<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>
<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date())
%>
<%
response.setHeader("Content-Type","video/x-msvideo");
response.setHeader("Content-Disposition", "attachment;filename=aaa.doc");
%>
Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。
注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。
(3)Authorization头的作用
Authorization的作用是当客户端访问受口令保护时,服务器端会发送401状态码和WWW-Authenticate响应头,要求客户机使用Authorization来应答。
例如:
<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>
<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date())
%>
<%
response.setStatus(401);
response.setHeader("WWW-Authenticate", "Basic realm=\"Tomcat Manager Application\"");
%>
3.如何实现文件下载
要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决?
两个特殊的相应头:
----Content-Type: application/octet-stream
----Content-Disposition: attachment;filename=aaa.zip
例如:
response.setContentType("image/jpeg");response.setHeader("Content- Disposition","attachment;filename=Bluehills.jpg");
如果文件中filename参数中有中文,则就会出现乱码。
解决办法:
(1)MimeUtility.encodeWord("中文.txt");//现在版本的IE还不行
(2)new String("中文".getBytes("GB2312"),"ISO8859- 1");//实际上这个是错误的
4. 测试并分析文件名乱码问题
response.setHeader()下载中文文件名乱码问题
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了上面一句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名为很长的中文文件名的情况。现如今经过仔细测试,发现文字只要超过17个字,就不能下载了。分析如下:
一. 通过原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也不对.
二. 解决方案:将文件名编码成ISO8859-1是有效的解决方案,代码如下:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在上Firefox (v1.0-en)下载也是乱码。
三. 参看邮件中的中文附件名的形式,用outlook新建一个带有中文附件的邮件,然后看这个邮件的源代码,找到:
Content-Disposition: attachment;
filename="=?gb2312?B?0MK9qCDOxLG+zsS1tS50eHQ=?="
用这个filename原理上就可以显示中文名附件,但是现在IE并不支持,Firefox是支持的。尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。
折中考虑,结合了一、二的方式,代码片断如下:
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see http://support.microsoft.com/default.aspx?kbid=816868
*/
if (fileName.length() > 150) {
String guessCharset = xxxx
//根据request的locale 得出可能的编码,中文操作系统通常是gb2312
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
编码转换的原理:
首先在源程序中将编码设置成GB2312字符编码,然后将源程序按Unicode编码转换成字节码加载到内存中(java加载到内存中的字节码都是Unicode编码),然后按GB2312编码获得中文字符串的字节数组,然后生成按ISO8859-1编码形式的Unicode字符串(这时的4个字节就变成了8个字节,高位字节补零),当在网络中传输时,因为setHeader方法中的字符只能按ISO8859-1传输,所以这时候就又把Unicode字符转换成了ISO8859-1的编码传到浏览器(就是把刚才高位补的零全去掉),这时浏览器接收到的ISO8859-1码的字符因为符合GB2312编码,所以就可以显示中文了。
5. jsp翻译成class时的编码问题
记事本中代码块1:
<%=
"a中文".length()
%>
代码块2:
<%@ page pageEncoding="gbk"%>
<%=
"a中文".length()
%>
为什么上面的输出值为5,改成下面的则输出3?因为上面的代码没有添加该文件的编码说明 , WEB应用程序在将jsp翻译成class文件时 , 把该字符串的内容按默认的保存方式指定的编码ASCII码来算的,在UTF-8中,原ASCII字符占一个字节,汉字占两个字节,对应两个字符,长度就变成了5 , 而下面的是GBK编码, 一个汉字和一个英文都对应一个字符,得到结果就为3.
%@>%@>%@>%=dateformat.getdatetimeinstance(dateformat.short,>%=dateformat.getdatetimeinstance(dateformat.short,>%br>%br>%=br>%=br>
引用地址:
注意: 该地址仅在今日23:59:59之前有效
利用Nginx替代apache实现高性能的Web环境 ,在freebsd下的安装更是方便,
一 . 安装必备软件
MySQL+PHP+Pcre
cd /usr/ports/database/mysql50-server && make install clean
cd /usr/lang/php5/ && make install clean 选择对cgi mysql等的支持
cd /usr/devel/pcre && make install clean
用ports安装 /usr/ports/www/nginx, make install clean
二、弄了一个fastcgi的脚本,来自lighttpd
1) cd /usr/ports/www/lighttpd
2) make
3) cp /usr/ports/www/lighttpd/work/lighttpd-1.4.18/src/spawn-cgi /usr/bin
4) make clean
三、修改配置文件:
1,/usr/local/etc/nginx/nginx.conf:
- user www www;
- worker_processes 10;
- error_log /usr/local/etc/nginx/logs/nginx_error.log
- events
- {
- use kqueue;
- worker_connections 51200;
- }
- http
- {
- include conf/mime.types;
- default_type application/octet-stream;
- charset gb2312;
- server_names_hash_bucket_size 128;
- keepalive_timeout 60;
- tcp_nodelay on;
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 8k;
- gzip_http_version 1.1;
- gzip_types text/plain application/x-javascript. text/css text/html application/xml;
- server
- {
- listen 80;
- server_name www.jianblog.com;
- index index.html index.htm index.php;
- root /usr/local/www/data/;
- location ~ .*\.php?$
- {
- include fcgi.conf;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- }
- log_format access '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" $http_x_forwarded_for';
- access_log /usr/local/nginx/logs/access.log access;
- }
- }
- 2 ,先将php.ini的配置中
- cgi.fix_pathinfo=1 这样php-cgi方能正常使用SCRIPT_FILENAME这个变量。
- 3,编辑fcgi.conf文件,加入
- fastcgi_param GATEWAY_INTERFACE CGI/1.1;
- fastcgi_param SERVER_SOFTWARE nginx;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- # PHP only, required if PHP was built with --enable-force-cgi-redirect
- #fastcgi_param REDIRECT_STATUS 200;
四,启动
1, 启动fcgi
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -f /usr/local/bin/php-cgi
参数说明:
-f 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置
-a 绑定到地址addr
-p 绑定到端口port
-s 绑定到unix socket的路径path
-C 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P 指定产生的进程的PID文件路径
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -f /usr/local/bin/php-cgi
引用地址:
注意: 该地址仅在今日23:59:59之前有效
当我们碰到一个目录下文件数量很多,直接使用rm命令时,报错说数量太多了,那时怎么办啊?我以前用了一个笨办法,写了一个脚本程序,根据文件名的不同,一次删除一部分,然后不断的循环,直到全部删除为止。现在可好了,有了下面的命令,就可以一次直接搞定了。
引用
ls | xargs -n 20 rm -fr
ls当然是输出所有的文件名(用空格分割)
xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm -rf的参数
也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了
引用
本文由ArthurXF倾情奉献,另ArthurXF受聘于上海非凡进修学院进行PHP等IT课程培训,有意学习者,可以免费试听,联系电话:021-51097877,QQ:29011218,MSN:onenight11@hotmail.com
引用地址:
注意: 该地址仅在今日23:59:59之前有效