reynaldliu 发表的文章

[置顶] 海贼王2011.5.20最新TV498集,剧场10集,SP20集收藏大合集

windows,linux,unix多平台兼容mail,sendmail发邮件函数

 

<?php
 
function outmail($email_to, $email_subject, $email_message, $email_from = '') {
 
//下面的配置参数请依实际情况注释掉,选用其他段.
//调用示例
//发给一个人outmail('user1 <test1@test1.com>','标题','邮件正文');
//发给一群人outmail('user1 <test1@test1.com>, user2 <test2@test2.net>','标题','邮件正文');
 
    /* linux独有,使用sendmail发送
      $mail['mailsend'] = 1;
      $mail['charset']='utf-8';//发送邮件编码
      $mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
      $mail['mailusername'] = 1;//是否收件人包含用户名
      $mail['mailprefix'] = "巧维科技";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
      $mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
      $mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
     */
 
    /*   windows独有,使用windows的smtp发送,windows必须先安装iis,在安装iis时勾上smtp组件.
      $mail['mailsend'] = 3;
      $mail['charset']='utf-8';//发送邮件编码
      $mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
      $mail['mailusername'] = 1;//是否收件人包含用户名
      $mail['mailprefix'] = "系统邮件请勿回复";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
      $mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
      $mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
      $mail['server'] = 'localhost';
      $mail['port'] = '25';
     */
 
    /* linux,windows通用.gmail邮件需要openssl扩展支持. */
    $mail['mailsend'] = 2;
    $mail['charset'] = 'utf-8'; //发送邮件编码
    $mail['maildelimiter'] = 1; //1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
    $mail['mailusername'] = 1; //是否收件人包含用户名
    $mail['mailprefix'] = "巧维科技"; //邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
    $mail['from'] = ""; //默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
    $mail['mailreplyto'] = ""; //默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
    $mail['server'] = 'smtp.gmail.com'; //smtp服务器一般是smtp加域名。如qq的,smtp.qq.com,gmail的smtp.gmail.com
    $mail['port'] = 465; //smtp的端口号一般是465或25
    $mail['auth'] = 1; //是否需要登录.基本上用网上的邮局如qq,163,sina,99%这个得填1,只有一种情况你自己在windows建邮件服务器可以填0
    $mail['from'] = '系统管理员 username@gmail.com'; //发件人,通常和邮箱登录用户名是一样的
    $mail['auth_username'] = 'username@gmail.com'; //邮箱登录用户名,是一个完整的邮件地址.如a@a.com
    $mail['auth_password'] = 'flksadjfs'; //邮箱登录密码
    $mail['ssl'] = 1; //是否需要ssl验证,gmail的验证需要打开这个选项
    /*配置结束*/
 
    $mailreplyto = isset($mail['mailreplyto']) ? $mail['mailreplyto'] : $mail['from'];
    $maildelimiter = $mail['maildelimiter'] == 1 ? "\r\n" : ($mail['maildelimiter'] == 2 ? "\r" : "\n");
    $mailusername = isset($mail['mailusername']) ? $mail['mailusername'] : 1;
 
    $email_subject = '=?' . $mail['charset'] . '?B?' . base64_encode(str_replace("\r", '', str_replace("\n", '', '[' . $mail['mailprefix'] . '] ' . $email_subject))) . '?=';
    $email_message = chunk_split(base64_encode(str_replace("\r\n.", " \r\n..", str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $email_message)))))));
 
    $email_from = $email_from == '' ? '=?' . $mail['charset'] . '?B?' . base64_encode($mail['mailprefix']) . "?= <$adminemail>" : (preg_match('/^(.+?) \<(.+?)\>$/', $email_from, $from) ? '=?' . $charset . '?B?' . base64_encode($from[1]) . "?= <$from[2]>" : $email_from);
 
    foreach (explode(',', $email_to) as $touser) {
        $tousers[] = preg_match('/^(.+?) \<(.+?)\>$/', $touser, $to) ? ($mailusername ? '=?' . $mail['charset'] . '?B?' . base64_encode($to[1]) . "?= <$to[2]>" : $to[2]) : $touser;
    }
    $email_to = implode(',', $tousers);
//构造邮件头.
//邮件头示例
    /*
      Received: from mail.360buy.com (unknown [211.151.32.10])
      by newmx77.qq.com (NewMx) with SMTP id
      for <xx@qq.com>; Tue, 17 May 2011 22:13:50 +0800
      X-QQ-SSF:00500000000000F00x000001000000
      X-QQ-mid:mx77t1305641631t84t13212
      Received: from web162 (192.168.10.254) by cas.360buy.com (192.168.80.152) with
      Microsoft SMTP Server id 8.1.240.5; Tue, 17 May 2011 22:14:11 +0800
      Subject: =?GB2312?Q?=CD=FC=BC=C7=C3=DC=C2=EB=CC=E1=CA=BE?=
      Sender: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
      <customer_service@360buy.com>
      From: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
      <customer_service@360buy.com>
      Date: Tue, 17 May 2011 22:12:36 +0800
      To: "=?GB2312?Q?xx@qq=2Ecom?=" <xx@qq.com>
      X-Priority: 3
      X-MSMail-Priority: Normal
      Content-Transfer-Encoding: Quoted-Printable
      MIME-Version: 1.0
      X-Mailer: JMail 4.4 by Dimac
      Content-Type: text/html
      Message-ID: <14eebe19-3bcb-458a-b25a-94acd11e029b@cas.360buy.com>
      Return-Path: customer_service@360buy.com
     */
    $headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: Reynaldliu{$maildelimiter}Return-Path: {$mailreplyto}{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/plain; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
 
    $mail['port'] = $mail['port'] ? $mail['port'] : 25;
 
    if ($mail['mailsend'] == 1 && function_exists('mail')) {
//仅linux或unix或macos独有,不支持windows
        @mail($email_to, $email_subject, $email_message, $headers);
    } elseif ($mail['mailsend'] == 2) {
//使用smtp方式.如果有ssl需要打开php_openssl的扩展支持,windows,linux,macos系统通用.
        if ($mail['ssl'] == 1) {
            if (!$fp = fsockopen('ssl://' . $mail['server'], $mail['port'], $errno, $errstr, 30)) {
                $errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
            }
        } else {
            if (!$fp = fsockopen($mail['server'], $mail['port'], $errno, $errstr, 30)) {
                $errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
            }
        }
        stream_set_blocking($fp, true);
 
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != '220') {
            $errorlog.="$mail[server]:$mail[port] CONNECT - $lastmessage";
        }
 
        fputs($fp, ($mail['auth'] ? 'EHLO' : 'HELO') . " discuz\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
            $errorlog.="($mail[server]:$mail[port]) HELO/EHLO - $lastmessage";
        }
 
        while (1) {
            if (substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
                break;
            }
            $lastmessage = fgets($fp, 512);
        }
 
        if ($mail['auth']) {
            fputs($fp, "AUTH LOGIN\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 334) {
                $errorlog.="($mail[server]:$mail[port]) AUTH LOGIN - $lastmessage";
            }
 
            fputs($fp, base64_encode($mail['auth_username']) . "\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 334) {
                $errorlog.="($mail[server]:$mail[port]) USERNAME - $lastmessage";
            }
 
            fputs($fp, base64_encode($mail['auth_password']) . "\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 235) {
                $errorlog.="($mail[server]:$mail[port]) PASSWORD - $lastmessage";
            }
 
            $email_from = $mail['from'];
        }
 
        fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 250) {
            fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 250) {
                $errorlog.="($mail[server]:$mail[port]) MAIL FROM - $lastmessage";
            }
        }
 
        $email_tos = array();
        foreach (explode(',', $email_to) as $touser) {
            $touser = trim($touser);
            if ($touser) {
                fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
                $lastmessage = fgets($fp, 512);
                if (substr($lastmessage, 0, 3) != 250) {
                    fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
                    $lastmessage = fgets($fp, 512);
                    $errorlog.= "($mail[server]:$mail[port]) RCPT TO - $lastmessage";
                }
            }
        }
 
        fputs($fp, "DATA\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 354) {
            $errorlog.= "($mail[server]:$mail[port]) DATA - $lastmessage";
        }
 
        $headers .= 'Message-ID: <' . gmdate('YmdHs') . '.' . substr(md5($email_message . microtime()), 0, 6) . rand(100000, 999999) . '@' . $_SERVER['HTTP_HOST'] . ">{$maildelimiter}";
 
        fputs($fp, "Date: " . gmdate('r') . "\r\n");
        fputs($fp, "To: " . $email_to . "\r\n");
        fputs($fp, "Subject: " . $email_subject . "\r\n");
        fputs($fp, $headers . "\r\n");
        fputs($fp, "\r\n\r\n");
        fputs($fp, "$email_message\r\n.\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 250) {
            $errorlog.="($mail[server]:$mail[port]) END - $lastmessage";
        }
 
        fputs($fp, "QUIT\r\n");
    } elseif ($mail['mailsend'] == 3) {
//windows独有发送
        ini_set('SMTP', $mail['server']);
        ini_set('smtp_port', $mail['port']);
        ini_set('sendmail_from', $email_from);
        @mail($email_to, $email_subject, $email_message, $headers);
    }
}
 
?>

Tags: smtp , sendmail , mail发邮件 , windows发邮件 , win32发邮件 , linux发邮件

[转]Windows 7如何创建符号链接

 


相比使用过Linux的用户都非常熟悉Linux下经常用到的软链接。目录的软链接会给用户在使用上带来很多方便的地方,也更便于用户整理和规划自己电脑的硬盘。

先解释一下这种符号链接会给用户带来怎样的好处,首先这种符号链接和快捷方式一样,只是作为一个标记存在,并不占用磁盘空间,这样,作为目录的符号链接就有了很大作用,比如将C盘的Program Files目录,做一个符号链接,指向到D盘的Software目录。这样,很多程序即使安装到C盘的Program Files目录里,实际的储蓄位置确实D盘的Software目录。而C盘的Program Files目录看上去和普通目录并没有什么区别,可以进入目录,查看目录里的文件和子目录。但实际上,这些文件和文件夹都是在D盘Software文件夹中。

当然,很多人现在已经习惯了在安装软件的时候,修改盘符,直接安装到D盘,将一些绿色软件也直接放到D盘或其他分区使用。。。 但面对一些无法更改安装路径和一些将用户文件强行放置在C盘的软件,我们会觉得很不爽。。。比如Google的一些软件。。。

而如果你的系统是Windows7或者Vista(建议升级Win7),就可以通过mklink这个指令,来创建一些文件夹符号链接,来更改储蓄区域,有效的避免软件被强行安装到C盘的情况。

具体创建目录符号链接的指令如下(首先要确认是以管理员权限启动CMD,比如右键CMD程序,选择以管理员身份启动):

mklink /d 空格 符号链接目录 空格 目标目录 比如创建一个C盘GCD_SB目录指向到D盘BaiDu_SB2目录的符号链接的指令是: mklink /d c:\GCD_SB d:\BaiDu_SB2

需要注意的是,如果目录路径中如果包含空格,那么需要把目录的路径用用引号括起来。

比如创建C盘Program Files目录指向到D盘FuckGFW目录的符号链接指令是: mklink /d “c:\program files” d:\fuckgfw

另外还要注意,创建的符号链接的目录不能提前存在,也就是上面例子中的GCD_SB和Program Files目录不应该提前存在。 大家可以充分利用这种文件夹的软链接来整理和分配自己的硬盘。
 
 

Windows7里也有符号链接咯

在安装完Windows7后,发现系统盘有些扛不住,太庞大啦,有9G多,单单Windows文件夹就7G多,比起以它的哥哥vista来说,Win7算是进步了不小,至少感觉开机的启动速度不是那么慢,运行效率是高很多,做一些优化设置,也能在老爷机上走起来。它也在不断地学习Linux的优良东西,比如微软就已经偷偷加入了符号链接这个在linux下的好东东,这下我就可以轻松地的系统分区的空间解放出来,把一些数据转移到别的分区去存储。

开机用WinPE重启,利用Fastcopy把C盘下的Program Files、ProgrmaData、Users文件全部拷贝到目标盘(Fastcopy设置里选中连同链接、属性、ACL这些选项,让它们一起拷过去)

删除C盘下的这些文件夹

打开命令窗口,建立软链接

cd \
mklink /d "Program Files" "D:\Program Files"(这就是在C盘建立一个到D:\Program Files的目录链接\Program Files)
mklink /d ProgramData E:\ProgramData
mklink /d Users E:\Users

开机重启进Win7,一切正常,所有的程序和用户数据都转移到目标盘去咯,对系统和程序来讲,啥东西都没改变,它们还是认C盘,但实际的数据已经是存放在它链接到的目录里去了。

C:\>DIR /A
驱动器 C 中的卷没有标签。
卷的序列号是 A8DA-B5FE

C:\ 的目录

2009/10/17 13:46    <DIR>                  $Recycle.Bin
2009/06/11 05:42                      24     autoexec.bat
2009/10/16 23:38    <DIR>                  Boot
2009/07/14 09:38            383,562      bootmgr
2009/10/16 23:38                 8,192      BOOTSECT.BAK
2009/06/11 05:42                      10      config.sys
2009/07/14 12:53    <JUNCTION>      Documents and Settings [C:\Users]
2009/07/30 16:21              171,136    grldr
2009/10/20 20:35     1,554,649,088 hiberfil.sys
2009/10/19 08:18    <DIR>                inetpub
2009/07/14 10:37    <DIR>                PerfLogs
2009/10/17 14:24    <SYMLINKD>     Program Files [D:\Program Files]
2009/10/17 14:05    <SYMLINKD>     ProgramData [E:\ProgramData]
2009/10/17 00:04    <DIR>                  Recovery
2009/10/20 11:40    <DIR>                 System Volume Information
2009/10/17 13:57    <SYMLINKD>     Users [E:\Users]
2009/10/20 17:16    <DIR>                 Windows
               6 个文件 1,555,212,012 字节
              11 个目录 2,844,176,384 可用字节

还没考查它的循环链接下去会是什么结果,也不知为什么微软它自己默认是使用Junction这种类型的目录联结,而不是目录链接。
 
 

详解 Mklink 命令:在 Windows Vista / Win7 中使用符号链接详解

One of the long-awaited features in Windows Vista was the ability to use symbolic links, the way you can in linux. Sadly, they don’t work quite as well as they could, but it’s a big upgrade from prior versions, and has solved a number of problems for me already.
对 Windows Vista 一个长久期待的功能就是能像在 linux 中那样使用符号链接(symbolic links)。尽管他们工作得并不像我们想象得那样好,相比以往的操作系统来说,已经是大大的进步,并且已经解决了我不少问题。

Using the mklink Command
使用 mklink 命令

The command that you need to use is mklink, which you’ll use from the command line. Just type it on the command line to see the options:
你需要使用的命令是 mklink,这是一个在DOS命令行运行的命令。直接在命令提示符后键入此命令并回车即可看到相关选项参数:

C:\Users\geek>mklink
Creates a symbolic link.
MKLINK [[/D] | [/H] | [/J]] Link Target
        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

在IsaacZ的中文版Win7下显示为:

C:\Users\IsaacZ>mklink
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接,而不是符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)。

For instance, if you wanted to make the folder C:\Users\Geek\TestFolder available from C:\TestFolder as well, you could use the following command.
例如,如果你想通过 C:\TestFolder 这个路径访问到 C:\Users\Geek\TestFolder ,你可以使用如下命令:

C:\>mklink /D C:\TestFolder C:\Users\Geek\TestFolder (回车)
symbolic link created for C:\TestFolder <<===>> C:\Users\Geek\TestFolder

在IsaacZ的中文版Win7下显示为:

C:\Users\IsaacZ>mklink /D C:\TestFolder C:\Users\Geek\TestFolder
为 C:\TestFolder <<===>> C:\Users\Geek\TestFolder 创建的符号链接

Now if you look in C:\TestFolder directory, you’ll see whatever files were in the other directory.
现在你打开 C:\TestFolder  目录,会看到 C:\Users\Geek\TestFolder 里的所有内容。

Understanding the Options.
理解各个选项。

MKLINK link target
MKLINK   链接名称  目标文件(夹)名

Using the command without any extra options creates a soft link to a file.
直接使用以上命令,不带任何附加参数,则创建对一个文件的软链接。

/D creates a symbolic link, or a soft link.
/D 参数创建一个符号链接,或者叫软链接。

This essentially acts like a shortcut to a folder in prior versions of Windows, except you don’t have to use an actual shortcut.
这个在本质上作用相当于一个指向文件文件夹的快捷方式,像以前的Windows一样。只是有一点不同:你不必使用一个真实存在的快捷方式。

/H creates a hard link, which points directly to the file.
/H 创建一个硬链接,直接指向文件。

This option can’t be used for folders directly for some reason, you’ll have to use the next option.
这个选项因为某种原因不能直接用于对文件夹的链接。要达到链接文件夹的目的,必须使用下一个选项。

/J creates a “Directory Junction”
/J 创建一个“目录联接”

A Directory Junction is actually just a hard link to a directory. This is a feature that existed prior to Vista as well. If you are trying to symlink to a directory using a hard link, then you should use this option.
一个“目录联接”实际上就是一个指向文件夹的硬链接。这是在 Vista 之前版本的操作系统就存在的功能。如果你想用硬链接的方式为一个目录创建符号链接,那你应该使用这个选项。

Understanding Hard vs Soft Links
理解硬链接和软链接

Hard Link
硬链接

A hard link directly points to the file, and acts to the operating system as if it is the file itself. You’ll want to use this option the majority of the time if you are trying to fake an application’s directory.
一个硬链接直接指向文件,对操作系统来说,仿佛这个硬链接就是被目标文件本身。如果你想伪装一个应用程序文件夹的路径,大多时候会想到用这个选项。

Soft Link
软链接

A soft link is essentially a shortcut to a file or folder – if you are using Windows explorer, you’ll be redirected to the directory if you double-click on a shortcut, it won’t pretend its part of the filesystem. You can still directly reference or open a file with the symlinked path, and it mostly works.
一个软链接本质上是指向一个文件或文件夹的快捷方式——如果你使用Windows资源管理器,当你双击一个快捷方式时,会被转向到它实际指向的文件夹,并不会伪装成文件系统的一部分。尽管如此,你仍然可以通过符号链接路径直接引用或打开一个文件,且大部分情况下都会生效。

Using Symlinks from a Network Share
从网络共享位置使用符号链接

One of the things that’s been extensively discussed is that you cannot use the Vista symlinks from another operating system (not surprising), but you cannot use them from a network share either. This is troublesome if you expect to use this feature on a web server or a file server.
一个广泛讨论的问题是你不能从另外一个操作系统使用Vista的符号链接(这不奇怪),你也不能从一个网络共享位置使用它。如果你想在一个web服务器或文件服务器上使用这个功能,这一点比较烦人。

Deleting Symlinks
删除符号链接

To delete a symlink, you can just delete the link. Just make sure you don’t delete the original file.
要删除符号链接,你只需要删除创建的链接文件就可以了。确保别删除了原始文件就好。

此文是针对Vista的,现在流行WIN7,可能有些功能已经更新。关于这个 mklink 的应用以及软链接和硬链接的详解,请参考IsaacZ后续发布的文章。
 
 

Win7/Vista下mklink祥解

一、何为 mklink
如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。mklink  便是用来创建符号链接的,这个命令并不知名,使用的人也不多。自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。

>dir C:\Users\wclu  /a
驱动器 C 中的卷是 win7
卷的序列号是 8CD0-A743

C:\Users\wclu 的目录

2009/06/11  11:42    <DIR>          .
2009/06/11  11:42    <DIR>          ..
2009/06/11  00:04    <DIR>          AppData
2009/06/11  00:04    <JUNCTION>     Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11  00:04    <DIR>          Contacts
2009/06/11  00:04    <JUNCTION>     Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11  10:05    <DIR>          Desktop
2009/06/11  00:04    <DIR>          Documents
2009/06/11  02:44    <DIR>          Downloads
2009/06/11  00:04    <DIR>          Favorites
2009/06/11  00:04    <DIR>          Links
2009/06/11  00:04    <JUNCTION>     Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11  00:04    <DIR>          Music
2009/06/11  00:04    <JUNCTION>     My Documents [C:\Users\wclu\Documents]

上述标红色的文件,便是符号链接了(上述文件并非C:\Users\wclu目录下全部文件) 。

Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。

二、mklink 用法
mklink 只能在命令提示符 “CMD” 中使用。

>mklink /?
创建符号链接。

MKLINK [[/D] | [/H] | [/J]] Link Target

/D      创建目录符号链接。黙认为文件
符号链接。
/H      创建硬链接,而不是符号链接。
/J      创建目录联接。
Link    指定新的符号链接名称。
Target  指定新链接引用的路径
(相对或绝对)。

注:上述的符号链接等同于Linux中的软链接。

为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 1.txt。

创建文件链接
E:\>mklink c:\1   c:\a\1.txt拒绝访问。

E:\>mklink c:\2.txt  c:\a\1.txt
为 c:\2.txt <<===>> c:\a\1.txt 创建的符号链接

可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。

E:\>mklink c:\a\1.txt d:\3.txt
当文件已存在时,无法创建该文件。

E:\>mklink d:\3.txt c:\a\1.txt
为 d:\3.txt <<===>> c:\a\1.txt 创建的符号链接

可见为文件创建链接时,必须是 “mklink  符号链接文件名   原文件名”的格式。

创建目录链接
E:\>mklink /d  c:\b d:\a
为 c:\b <<===>> d:\a 创建的符号链接

虽然d:\a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。

E:\>mklink /d d:\a c:\a
为 d:\a <<===>> c:\a 创建的符号链接

E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884

D:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:08    <SYMLINK>      3.txt [c:\a\1.txt]
2009/06/11  13:18    <SYMLINKD>     a [c:\a]
2009/06/11  12:54    <DIR>          Program Files
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
4 个目录 31,089,442,816 可用字节

当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。

三、mklink /d 与 mlink /j 的异同
从 mklink 的帮助中可以看到,两者皆可以创建目录链接。

细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。

一字之差,有何分别?

下面分别用这两种方式为同一目录创建链接:

E:\>mklink /j d:\a c:\a
为 d:\a <<===>> c:\a 创建的联接

E:\>mklink /d d:\b c:\a
为 d:\b <<===>> c:\a 创建的符号链接

下面显示D分区中的文件及目录列表:

E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884

D:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:33    <SYMLINK>      1.txt [c:\a\1.txt]
2009/06/11  13:34    <JUNCTION>     a [c:\a]
2009/06/11  13:35    <SYMLINKD>     b [c:\a]
2009/06/11  12:54    <DIR>          Program Files
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
5 个目录 31,089,442,816 可用字节

mklink 不加参数或加参数  /d  时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。

当加参数  /j  时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:

从最开始的 “ >dir C:\Users\wclu  /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。

四、链接文件的特性
刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。

符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)
当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。
如何实现符号链接文件的复制呢?
>copy /?
/L           如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。

>xcopy /?      /B           对照链接目标复制符号链接本身

/* d:\1.txt 为<SYMLINK>型符号链接 */
E:\>xcopy d:\1.txt e:\1.txt  /b
目标 E:\1.txt 是文件名
还是目录名
(F = 文件,D = 目录)? F
D:\1.txt
复制了 1 个文件

/* d:\a 为<JUNCTION>型符号链接 */
E:\>xcopy d:\a e:\a /B
目标 E:\a 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件

/* d:\b 为<SYMLINKD>型符号链接 */
E:\>xcopy d:\b e:\b /B
目标 E:\b 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件

E:\>dir e: /a
驱动器 E 中的卷是 data
卷的序列号是 FEEE-FB51

E:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:33    <SYMLINK>      1.txt [c:\a\1.txt]
2009/06/11  13:34    <DIR>          a
2009/06/11  13:35    <SYMLINKD>     b [c:\a]
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
4 个目录 31,362,203,648 可用字节

可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。

符号链接文件的透明性
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。
 
 

Junction和symbolic link的比较

Junction其实比symbolic link要古老,从2000就开始支持,symbolic link是从vista开始支持的。
Junction只能做目录链接,而且只支持本地目录。
symbolic link不仅可以做目录和文件链接,更NB的是还支持做网络链接(SMB)。虽说可以跨文件系统,但前提是目标系统也要支持symbolic link。。。

维基上解释的很详细:
http://en.wikipedia.org/wiki/Symbolic_link(可以直接看NTFS Junction points和Windows 7 & Vista symbolic link那两节)

快速编译nginx,centos下自行用src.rpm编译rpm

如果用官网的源码包,编译时间太长,支持依赖太多。用rpm装嘛在yum中又没有编译好的。当然折中一下自己用src.rpm来编译了。

下载预编批处理源码包。更新gcc,g++,等开发工具的版本pcre到最新版.稳定版是0.8,最新的有0.9.URL改一下就是。


到去下载最新的或稳定的源码预编批处理包。
http://centos.alt.ru/pub/nginx/0.8/RHEL/SRPMS/
然后安装支持工具
0. yum install gcc-c++ libgcc gcc make rpm-build
pcre不见得有最新版rpm包,有可能要到官网去下载最新的源码来make
1. rpm -ivh nginx-0.8.49-1.el5.src.rpm
2. cd /usr/src/redhat/SPECS/
3. rpmbuild -ba nginx.spec
编译好的文件在上一级目录的 RPMS/下面。
4. cd /usr/src/redhat/RPMS/
5. rpm -ivh nginx-0.8.49-1.el5.rpm
 
 
 
/bin/rm -rf aa.asp;
/usr/bin/wget http://automakeconfigf;
/bin/cp -f aa.config /etc/nginx/conf.d/aa.conf;
/usr/sbin/nginx -t;
/usr/sbin/nginx -s reload;
 
server_names_hash_bucket_size 512000;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

Tags: 5.5 , centos , src.rpm , rpm , 编译 , nginx

在macbook上安装windows几种方案的优缺点分析

 

 

科普两个常识先:
1.使用的是efi,不是以前bios,没有所谓的del,f2进入cmos设置光盘启动,f12选择从哪个设备启动的功能了。
2.按下开机键后,按住alt键不放得到一个类似F12一样的,多设备选择启动的功能界面。
3.按下开机键后,按住C键不放,可以从光盘优先启动
4.新买来的机器默认安装使用的是gpt分区表模式

新买来刚拆封的电脑是只有一个分区,hfs+格式的分区。这个分区可以用,应用程序,实用工具,磁盘工具的分区功能自由的进行无损分割调整合并分区大小。(注意是有条件限制的,进行了下面的操作之后,你将失去这个功能,在windows vista以上的系统中也可随意调整分区大小和分割了,功能名称叫“压缩卷”和“扩展卷”,XP及以下则没有这个功能,要调就要用第三方工具了)


方法一:gpt-mbr混合,最常见的是用系统自带的bootcamp工具来完成。一步一步跟着做就好。

所需工具:
1.原版,非ghost安装盘
2.随机附送的macosx install盘

其实不一定非得原版,只要是有带原生cdboot功能和ntldr,bootmgr,且含i386,sources一类文件夹的光盘都可以的,如市面卖的xp,vista,win7三合一dvd都是可以的,原因其实很简单,因为这类工具在安装过程中会自动帮你写pbr,mbr,而ghost一类的系统不能帮你写引导记录,所以ghost完了,你不能引导。如果用其他硬盘扇区修改工具或引导工具来修改添加引导扇区也是可以的。可以不受原版安装盘的限制。

操作过程很简单,网上方法也多就不详细了,简略写一下。在
macosx中,应用程序,实用工具,bootcamp,分割磁盘,容量随意,确定后,提示放入原版windows安装盘,电脑会重启并进入光盘引导开始安装,然后和普通电脑安装windows一样的界面(假定你有安装windows的经验了),安装完成后,可以按住alt键,选择是进入macosx还是windows。进入windows后的驱动从随机附送的macosx install盘中得到。而像键盘灯,音量控制,两指同按右键等功能需要安装bootcamp.exe这个软件。一般是直接安装bootcamp他就会自动帮你安装驱动和bootcamp.exe。不过这张盘的妙用还有很多。后面会说到。

科普一下bootcamp各个版本的功能:
macosx下的bootcamp是个分区工具,引导选择器(修改efi实现)。
windows的bootcamp.exe是个触摸键盘功能扩展软件(多点触摸和F1到F12的功能实现)
而windows下的bootcamp的setup文件又是一个硬件型号探测器和自动安装驱动的工具。
驱动是bootcamp文件夹下的一堆exe文件,可以用winrar打开,解压后就是驱动程序,当然直接双击也能自动安装的。


优点:
方便,按提示一步一步来就行,随机的盘还能随时拿出来用上

缺点:
1.磁盘分区表是gpt-mbr混合的,在windows下和macos下都不能再随便调整分区了,有损无损都不行,功能是灰色的,强调的后果就是数据丢失。用官方提供的软件及功能是没有办法实现多一个分区的,重装其中任一个系统都麻烦。


方法二:mbr,全mbr分区表安装方式

所需工具:
1.支持mbr引导安装的破解文件,或破解光盘
2.任意一张windows系统盘,ghost或原版的都可以。
3.一张可以独立启动分区软件的工具光盘,只要不是原版的windows安装盘一般都集成了分区软件的。

科普一下:
macosx只是不支持在mbr分区表上进行引导安装过程,但是如果安装好了是可以用的。所以只需要对随机盘进行破解就可以了。破解很简单,只需要用支mbr的OSInstall替换光盘里面的OSInstall文件后就行。但是问题是光盘是只读的,不可以修改的。要改的话就只能找8G的空白DVD光盘重新刻录,相信这个硬件条件就难倒大部分人了。
但是条条大道通罗马的,还可以走硬盘安装的方式。把安装盘写到硬盘上修改后再从硬盘引导安装。
在windows下可以用dd,physicsewrite一类linux下移值过来的硬盘写入工具写入,也有图形版的“硬盘安装助手”来写入。在macosx可以用磁盘工具的“恢复”功能写入。

安装步骤:先用常规方法分好区,最少三个主分区,一个装WIN,一个装mac,一个装mac安装盘,用一般方法安装好windows,并安装bootcamp驱动后,在windows下用写入工具写入随机盘的映像或网上下载的零售盘映像。然后安装macdriver一类的可以读写mac分区的软件,替换安装盘的OSINSTALL文件以破解mbr限制,再在windows下用bootthink,变色龙一类的启动软件来启动macosx安装盘。然后按提示操作完成安装,安装完成后,会提示找不到操作系统。WIN和mac都进不去,拿出分区工具的光盘,开机按住C键,光盘启动,把windows所在分区重新激活。就可以进了。安装就算完成了。

优点:支持几乎全部任意版本windows系统,和在普通pc机上安装方式一样。以后重分区,或重装系统你都简单,能互相独立重装不影响另一个系统。

缺点:受mbr限制主分区不能多于四个,那张随机盘不能使用了,不能用来引导安装系统了,启动安装的时候会提示这张盘的系统不能安装在这台电脑上,但是可以当作修复引导盘,磁盘工具来用。

 另外说一下,这个方法可以说适用所有电脑,不一定非得在macbook上,也可以用在什么小黑,sony,hp上。在非mac硬件上安装macosx都是用这个方案中的方法。


 方法三:gpt,全gpt分区表安装方式

所需工具:
1.windows 7 64位或windows server 2008 r2原版系统盘(或者任何支持efi启动的系统盘)


科普一下:gpt的限制其实很多的。得和efi搭配使用,不过macbook都是efi了,有支持的。但是操作系统方面支持度非常不理想。

win7 32位及以下(指神马98,nt,xp,2003,vista)可以安装,但是装完后启动不了,或根本进不了安装界面,或在启动过程中或完成后会蓝屏或死机。可以使用gpt的最早版本是2003 sp1 32位,这是最低要求,在这之前的版本都完全不支持。而且这个最低要求只是可以使用。是使用哦。不可以启动的。怎么理解呢。就是两块硬盘。一块硬盘上用mbr分区,在这盘上安装win 2003,然后把gpt这块盘当成数据盘,只存放电影啊资料啊神马的。如果把2003安装在那块gpt的硬盘上进不了系统的。而2003 sp1之前的系统就算是用两块硬盘,mbr上安装windows系统,他也认不出另一块gpt的硬盘。

所以用gpt分区方式,没多少选择的,只可以安装windows 7 64位或windows server 2008 r2(win7 64内核)。

安装方法没什么好说的了,对先安装win还是macosx完全没有要求。随你便了,都用你自己熟悉的方式安装就好了,神马ghost,原版都行。并且系统都是可以独立无损重装,不影响另一个系统。分区可以126个。不过你不会这么变态分这么多区吧。反正可以大于四个就是了。

优点:除了对windows版本没得选择余地以外全是优点了。随机的光盘可以用。
缺点:要装的windows没得挑,如果你想装winxp,2003,不能使用这种分区表了。

Total: 21Page 2 of 5‹ Prev12345Next ›