分类目录归档:运维

Centos下用upstart管理自己的服务程序

Upstart是Ubuntu用来进行服务进程管理的服务,本文介绍如何利用upstart来通过Centos操作系统管理我们自己开发的应用程序。

什么时候要管理我们的应用程序?当我们开发出服务类的应用程序,比如后台服务器程序,需要长时间不间断运行的程序,当我们需要关闭时通常需要查看一下线程号再kill掉(当然你也可以写一个脚本做这件事),还需要检查程序什么时候崩溃了及时重启,当部署很多机器时非常麻烦。这时用upstart管理程序,可以用start stop启动、关闭服务,同时可以监控你的服务,再他出现意外退出时重新启动。

下面我就开始一步一步开始用upstart管理我们的程序吧!

1、安装upstart

用 yum install upstart安装upstart

2、添加配置文件

安装好upstart后,需要为每一个你想要通过upstart管理的程序添加一个配置文件。这些文件放在/etc/init目录下,文件名为你这个服务的名称,后缀名为.conf。如:myServerName.conf。

3、最简单的配置文件内容:


 author "lihanlin"
 description "test"

 start on startup
 stop on shutdown
 respawn
 console output

 exec /lihanlin/test/testServer

第一行是指定作者,第二行是程序的描述 这两行不起任何作用,只是说明

第四行的start on是配置发生某些事件时启动程序,这里意思是开机时启动程序。还可以用如下配置,在文件系统跟网络正常时启动程序

start on filesystem and net-device-up IFACE=lo

第五行的stop on是配置发生某些事件时关闭程序,这里的意思是关机时候关闭程序。

第六行respawn是程序意外关闭时自动重启程序。还可以用respawn limit: 命令,设置服务异常停止后重启次数及间隔时间。比如:

respawn limit 10 5

第七行console是配置输入输出。你可以改变设置指定工作将信息输出到哪里,从哪里获得输入。console字段你可以指定下列参数之一:output(从 /dev/console获得输入输出);owner(输出和Control-C发送给主进程) ;none(1.4版本之前的默认参数,输入输出指定到/dev/null);log(1.4版本级以后的默认参数,版本过低时没有此参数。将输出写到log文件中,该文件默认放在/var/log/upstart/中,可以通过命令行参数–logdir 设置log文件夹)

第九行是最关键的,exec参数指定了主程序执行的命令,就是你要监控的程序了。如果不是二进制文件,还可以是如下形式:(例如node程序)

exec /usr/bin/node /lihanlin/server.js

4、启动关闭程序:

你的服务名字是配置文件(不包括后缀名)名字

启动服务是initctl start myServerName(或者start myServerName)

关闭服务是initctl start myServerName(或者stop myServerName)

查询服务状态是initctl status myServerName(或者stop myServerName)

5、带脚本的配置文件:

假设我的这个/mnt/kvm/test/testServer 服务需要相对路径下的test.so库文件,那么这个时候用上面的配置文件就不能正常的启动服务了,因为相对路径找不到这个库文件。再或者需要做一写脚本处理等等,就需要再执行主程序时运行一下脚本。为了解决这个问题就需要用下面这种配置:

author "lihanlin"
description "counttest"
 
start on filesystem and net-device-up IFACE=lo
stop on shutdown
respawn
console log
 
script
   cd /lihanlin/test
   exec ./testServer
end script

这里script – end script中间编写了一些脚本,是主运行脚本。进入到/lihanlin/test文件夹里再启动服务,就能找到相对路径下的库文件了。

除了主运行脚本,还有:

pre-start: 脚本块,在主运行脚本之前执行的脚本
post-start: 脚本块,在主运行脚本之后,running状态之前
pre-stop: 脚本块,在执行stop之前
post-stop: 脚本块,在主运行脚本被杀死之后

这里只介绍了最简单的管理程序的方法,upstart还有很多功能,还想更加细致的学习的同学可以查看官方文档进行学习:

http://upstart.ubuntu.com/cookbook/

用 Upstart 守护 Ghost

在“在阿里云上安装 Ghost”系列教程中我们讲解了如何安装 Node.jsNginxMySQLGhost ,并最终启动 Ghost 完成博客系统的搭建。在最后一篇教程中,我们讲解了使用 forever 作为 Ghost 的守护程序,当 Ghost 进程意外死掉的时候,forever 会自动启动新的 Ghost 进程,这样就能让博客永不下线。但是,如果服务器重启了或者 forever 死掉了呢?这时 forever 就无能为力了。接下来我们介绍新的工具 — Upstart,它既能守护 Ghost 进程,也能在服务器重启时自动启动 Ghost 。

介绍 Upstart

Upstart is an event-based replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.

Upstart 是一个基于事件的守护进程,用来替代 /sbin/init ,它既能在系统启动/关机时启动/关闭任务和服务进程,也能在系统运行阶段监控这些任务和服务进程。

It was originally developed for the Ubuntu distribution, but is intended to be suitable for deployment in all Linux distributions as a replacement for the venerable System-V init.

Upstart 最初是为 Ubuntu 发行版开发的,但是也能部署到其他所有的 Linux 发行版上以取代经典的 System-V init

为 Ghost 创建 Upstart 配置文件

进入 /etc/init 目录,然后执行以下指令:

nano ghost.conf  

然后复制/粘贴以下配置信息:

description "Ghost Blogging Platform"  
author      "www.ghostchina.com"  
start on runlevel [2345]  
stop on shutdown

respawn  
respawn limit 99 5

script  
    cd /your/ghost/folder
    npm start --production 2>&1 >> /dev/null
end script  
  • description 描述信息。
  • npm start --production 2>&1 >> /dev/null 启动 Ghost,并将 stdout 和 stderr 中输出的信息全部丢弃。/dev/null 就像一个黑洞,任何写入的内容都将消失。这里我们的用意是不记录任何日志。

保存上述文件。然后启动 Ghost :

sudo start ghost  

你会看到类似下面的输出信息:

ghost start/running, process 7869  

7869 是进程 ID,每次运行可能会不同。但是,看到这条消息就说明 Ghost 正常启动了。

其他指令

关闭 Upstart 服务的指令为:

sudo stop ghost  

重启 Upstart 服务的指令为:

sudo restart ghost  

总结

虽然 forever 提供了一些额外的功能,但是用处有限,而且,forever 守护进程死掉的话,没有守护进程来重启它。这方面 pm2 更胜一筹,它会为自己创建几个 System V init 脚本,让操作系统作为自己的守护进程,这就和我们介绍的 Upstart 是一样的,只是我们直接让操作系统守护 Ghost ,省去了中间层(forever 或 pm2)。

pm2 的详细介绍和用法可以参考这里:https://github.com/Unitech/pm2

pm2 还有很多高级功能是 forever 和 Upstart 所不具备的,这将在以后的文章中介绍。

Nginx Upstream timed out (110: Connection timed out)

在Nginx错误日志中,有大量的下列信息:

Upstream timed out (110: Connection timed out) while reading response header from upstream

发生有两种情形:

  1. nginx proxy

需要适当的调整proxy_read_timeout值。

location / {
        ...
        proxy_read_timeout 150;
        ...
    }
  1. Nginx作为php-fpm等等其他的有上游服务

在这种情况下,适当的调整fastcgi_read_timeout选项值

location ~* .php$ {
    include         fastcgi_params;
    fastcgi_index   index.php;
    fastcgi_read_timeout 150;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

no such device

环境:VMWare ESX4.0,Ubuntu 9.10 Server

  在本地为Ubuntu创建VMWare的虚拟机后,复制,创建一个新的克隆镜像,启动,网卡无效,显示错误”eth0: ERROR while getting interface flags: No such device”。

原因

新克隆的虚拟机镜像的网卡mac地址已经变更。打开虚拟机的.vmx文件,ethernet0.generatedAddress项记录了该虚拟机的mac地址。

查看所有适配器信息

ifconfig -a

发现除了原来的eth0外,Ubuntu已经将新网卡命名为eth1。
Ubuntu保存网卡mac地址和设备名的配置文件在

/etc/udev/rules.d/70-persistent-net.rules

网卡的网络配置保存在

/etc/network/interfaces

该配置文件中只有原来eth0的配置信息。

解决方案1

移动/删除rules文件。(未验证) 
重启后Ubuntu会创建新的rules文件。 
将新网卡辨认为eth0,沿用原eth0的网络配置。 
如果网络配置是自动获取IP,则无需做其他修改。

sudo mv /etc/udev/rules.d/70-persistent-net.rules
/etc/udev/rules.d/70-persistent-net.rules.old

解决方案2

修改rules文件。(未验证)

sudo pico /etc/udev/rules.d/70-persistent-net.rules

原内容如下

# PCI device 0×1022:0×2000 (pcnet32)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”,
ATTR{address}==”00:0c:29:50:xx:xx”, ATTR{type}==”1″, NAME=”eth0″

# PCI device 0×1022:0×2000 (pcnet32)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”,
ATTR{address}==”00:0c:29:36:xx:xx”, ATTR{type}==”1″, NAME=”eth1″

删除eth1的配置,用eth1的mac地址替代eth0的mac地址。

# PCI device 0×1022:0×2000 (pcnet32)
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”,
ATTR{address}==”00:0c:29:36:xx:xx”, ATTR{type}==”1″, NAME=”eth0″

重启后Ubuntu同样会将新网卡辨认为eth0,沿用原eth0的网络配置。 
如果网络配置是自动获取IP,则无需做其他修改。 

解决方案3

修改interfaces文件。(已验证)

sudo pico /etc/network/interfaces

将所有的eth0替换为eth1。

svn强制要求提交注释–pre-commit钩子(转载)

问题 浏览器 DEMO 解决方法 Hacking Rules:

property:all-ie\9; property:gte-ie8\0;*property:lte-ie7; +property:ie7; _property:ie6;

1 input[button | submit] 不能用 margin:0 auto; 居中 IE8 bug | fixed 为input添加width 2 body{overflow:hidden;}没有去掉滚动条 IE6/7 bug | fixed 设置html{overflow:hidden;} 3 hasLayout的标签拥有高度 IE6/7 bug | fixed *height:0;
_overflow:hidden; 4 form>[hasLayout]元素有margin-left时,子元素中的[input | textarea] 出现2×margin-left IE6/7 bug | fixed form > [hasLayout 元素]{margin-left:宽度;}
form div{*margin-left:宽度÷2;} 5 当border-width有1条<边3条时被设置成dotted时,1px的边dotted显示成dashed IE7 bug | fixed 不在同一个元素上使用不同宽度的 dotted 6 当子元素有position:relative的时候,父元素设置overflow:[hidden|auto]相当于给子元素设置了position:visible; IE6/7 bug | fixed 给父元素设置position:relative; 7 :hover伪类不能改变有position:absolute的子级元素的left/top值 IE7 bug | fixed 把top/left的值设置成除0%外的所有百分值;或添加一个margin-[所有方向]除0外的所有值,包括0% 8 :focus + selector {} 选择器失效 IE8 bug | fixed 在失效选择器后面添加一个空选择器, :focus{} 9 列表中混乱的浮动:在list中浮动图片时,图片出现溢出正常位置;或没有list-style IE8 bug | fixed 用背景图片替换list-style 10 th 不会自动继承上级元素的 text-align IE8 bug | fixed 给th添加text-align:inherit; 11 样式(包括link/style/@import(link)) 最多允许个为是:32 IE6-8 ─ 常识 99.99%的情况下,不会遇到 12 :hover 时若background-color为#fff, 失效 IE7 bug | fixed 把background-color改成background。或者,非#fff || #ffffff 13 忽略’>’后有注释的选择器:selector> /**/ selector{} IE7 bug | fixed 官方DEMO有误 14 * html IE6 ─ HACK 只对IE6有效 15 PNG图片中的颜色和背景颜色的值相同,但显示不同 IE6-7 bug | fixed 利用 pngcrush 去除图片中的 Gamma profiles 16 margin:0 auto; 不能让block元素水平居中 IE6-8 bug | fixed 给block元素添加一个width 17 使用伪类 :first-line | :first-letter, 属性的值中出现!important 会使属性失效 IE8 bug | fixed !important is evil, don’t use it anymore 18 :first-letter 失效 IE6 bug | fixed 把 :first-letter 移到离{}最近的地方,如 h1, p:first-letter{},而非 p:first-letter h1{} 19 Position:absolute元素中,a display:block, 在非:hover时只有文本可点击 IE6/7 bug | fixed 给a添加background, 如果背景透明,使用background:url(‘任何页面中已经缓存的文件链接’),不推荐background:url(#)[官方的解决方法],因为会增加一下HTTP请求 20 float列表元素不水平对齐:li不设置float,a设置display:block;float:[方向],li不水平对齐 IE6/7 bug | fixed 给li设置display:inline 或 float:[方向] 21 dt, dd, li 背景失效 IE6 bug | fixed dt, dd, li{position:relative;} 22

【转】centos5.2 安装gearmand gearman for php

PHP客户端Gearman扩展安装:

wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable/
./configure –prefix=/usr
make && make install
/sbin/ldconfig
cd ../

wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9/
./configure
make
make install
/sbin/ldconfig
cd ../

wget http://pecl.php.net/get/gearman-0.5.0.tgz
tar zxvf gearman-0.5.0.tgz
cd gearman-0.5.0
/usr/local/webserver/php/bin/phpize
./configure –with-php-config=/usr/local/webserver/php/bin/php-config –with-gearman
make
make install
cd ../

php.ini文件中增加:

extension = “gearman.so”

——————————————————————————–

以守护进程启动:

gearmand -L 192.168.0.1 -p 4730 -u root -d

从 PHP 使用 Gearman

从 PHP 使用 Gearman 类似于之前的示例,惟一的区别在于这里是在 PHP 内创建 producer 和 consumer。每个 consumer 的工作均封装在一个或多个 PHP 函数内。

清单 1 给出了用 PHP 编写的一个 Gearman worker。将这些代码保存在一个名为 worker.php 的文件中。

清单 1. Worker.php
addServer(); $worker->addFunction(“title”, “title_function”); while ($worker->work()); function title_function($job) { return ucwords(strtolower($job->workload())); }?>

清单 2 给出了用 PHP 编写的一个 producer,或 client。将此代码保存在一个名为 client.php 的文件内。

清单 2. Client.php
addServer(); print $client->do(“title”, “AlL THE World’s a sTagE”); print “\n”;?>

现在,可以用如下的命令行连接客户机与 worker 了:

$ php worker.php &$ php client.phpAll The World’s A Stage$ jobs[3]+ Running php worker.php &

这个 worker 应用程序继续运行,准备好服务另一个客户机。

LINUX svn独立配置(不依附APACHE)(转载)

转载自http://www.svn8.com/svnpz/20100129/19756.html

以root用户登录。
将subversion-1.5.1.tar.gz和subversion-deps-1.5.1.tar.gz传到服务器。

tar xfvz subversion-1.5.1.tar.gz
tar xfvz subversion-deps-1.5.1.tar.gz
cd subversion-1.5.1
./configure –prefix=/opt/svn –without-berkeley-db –with-zlib
(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
make clean
make
make install

svn测试
/opt/svn/svnserve –version

如果显示如下,svn安装成功:

svnserve, version 1.5.1 (r21228)
compiled Oct 12 2006, 10:18:56Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository back-end (FS) modules are available:

* fs_fs : Module for working with a plain file (FSFS) repository.

2. svn配置
建立svn版本库目录
可建多个:
/opt/svn/mkdir -p /opt/svndata/repos1
/opt/svn/mkdir -p /opt/svndata/repos2

建立svn版本库
svnadmin create /opt/svndata/repos1
svnadmin create /opt/svndata/repos2

修改svn版本库配置文件
版本库1:
vi /opt/svndata/repos1/conf/svnserve.conf

内容修改为:
[general]
anon-access = none
auth-access = write
password-db = /opt/svn/conf/pwd.conf
authz-db = /opt/svn/conf/authz.conf
realm = repos1

版本库2:
vi /opt/svndata/repos2/conf/svnserve.conf

内容修改为:
[general]
anon-access = none
auth-access = write
password-db = /opt/svn/conf/pwd.conf
authz-db = /opt/svn/conf/authz.conf
realm = repos2

即除realm = repos2外,其他与版本库1配置文件完全相同。如果有更多的版本库,依此类推。

配置允许访问的svn用户
vi /opt/svn/conf/pwd.conf

为了简化配置,2个版本库共用1个用户配置文件。如有必要,也可以分开。

注意:对用户配置文件的修改立即生效,不必重启svn。

文件格式如下:
[users]
<用户1> = <密码1>
<用户2> = <密码2>

其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
[users]
alan = password
king = hello

配置svn用户访问权限
vi /opt/svn/conf/authz.conf

为了简化配置,3个版本库共用1个权限配置文件/opt/svn/conf/pwd.conf。如有必要,也可以分开。文件中定义用户组和版本库目 录权限。

注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。

用户组格式:
[groups]
<用户组名> = <用户1>,<用户2>
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。

版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>

其中,方框号内部分可以有多种写法:
/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
repos1:/,表示对版本库1设置权限
repos2:/abc, ,表示对版本库2中的abc项目设置权限
repos2:/abc/aaa, ,表示对版本库2中的abc项目的aaa目录设置权限

权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。

示例:
[groups]
admin = alan

[/]
@admin = rw

[repos1:/abc/aaa]
king = rw

[repos2:/pass]
king =

svn配置完毕,删除无用文件
rm /opt/svndata/repos1/conf/authz
rm /opt/svndata/repos1/conf/passwd
rm /opt/svndata/repos2/conf/authz
rm /opt/svndata/repos2/conf/passwd

启动svn
svnserve -d -r /opt/svndata

其中:
-d表示以daemon方式(后台运行)运行
-r /opt/svndata指定根目录是/opt/svndata

检查:
ps -ef|grep svnserve

如果显示如下,即为启动成功:
svn    6941   1 0 15:07 ?    00:00:00 svnserve -d –listen-port 9999 -r /opt/svndata

SVN 向版本中导入文件操作:
/opt/svn/bin/svn import -m “project” /var/www/dotproject svn://192.168.6.109/repos1
其中 -m “project”为创建说明
/var/www/dotproject 为需要导入文件的目录
svn://192.168.6.109/repos1 为SVN路径。

SVN 导出版本中的文件操作:
svn checkout svn://192.168.6.109/repos1 dotproject
其中 dotproject为需要导入的目录名.

SVN 说明书:
http://www.subversion.org.cn/svnbook/1.1/

说明:

我按着流程配置过程中遇到两处问题。

1.个是配置文件报错。去掉前面的空格即可

2.是xxx.lock  权限问题。改下权限即可。chmod 和 chown都可以达到目的。

增加虚拟机硬盘空间(转载)

  VMware6.0安装目录下有一个命令行工具vmware-vdiskmanager.exe 程序,可用来修改虚拟机硬盘的大小。方法如下:

  1. 关闭虚拟机;启动Windows下的命令提示符界面;

  2. 命令进入VMware的安装目录(如:D:\VMware),输入“vmware-vdiskmanager”后按回车键,可显示关于该命令的说明。

  3. 执行如下命令:vmware-vdiskmanager -x 20Gb “J:\VMware Space\SUSE Linux 64-bit.vmdk”参数-x表示要扩展虚拟机硬盘空间;紧随其后的数字指要扩展的大小(如20Gb,表示磁盘总量,包含原来的磁盘容量);最后是要 操作的虚拟机Linux的具体文件。若路径名中有空格,必须以双引号括起来。

  等待约20分钟,执行完毕,退出命令提示符窗口,重启VMware,这时虚拟机硬盘空间已变成20GB了。这个过程中,已安装的Linux系统不会被破坏。

  如果原来的虚拟机硬盘已被分成了多个分区,那么在通过 vmware-vdiskmanager.exe扩大了硬盘空间后,还需要在虚拟机系统中将增加的分区划分、格式化。

  4. 启动虚拟机系统,用root登录(后续所有步骤都应以root用户身份登录操作),在 命令行用fdisk -l查看。由于这里是直接修改了原始空间大小,因此可以看到/dev/sda空间改变为21.4GB。如果是从VMware菜单里增加虚拟硬盘,则会多出 一个/dev/sd?,这里的?代表硬盘编号,第一个硬盘编号为a即sda,第二个就是sdb,第三个是sdc,以此类推,一般来说,如果以前没有增加过 硬盘,那么原来的硬盘就是sda,通过VMware菜单增加的虚拟硬盘编号就是sdb。如果添加的第二块硬盘是IDE硬盘,就应该看到hdb,如果是 SCSI硬盘,看到的就应该是sdb。

  hawkzy:~ # fdisk -l

  Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders

  Units = cylinders of 16065 * 512 = 8225280 bytes

  Disk identifier: 0x00067588

  Device Boot Start End Blocks Id System

  /dev/sda1 1 95 763056 82 Linux swap / Solaris

  /dev/sda2 * 96 868 6209122+ 83 Linux

  /dev/sda3 869 1958 8755425 83 Linux

  5. 使用fdisk /dev/sda进入菜单项,m是列出菜单,p是列出分区表,n是增加分区,w是保存并推出。由于系统已经有了3个主分区,因此将这次新增的空间划分为扩展分区,再将扩展分区重新分区。由于这里扩展分区只有5G,因此5G划为一个区。

  hawkzy:~ # fdisk /dev/sda

  Command (m for help): p

  Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders

  Units = cylinders of 16065 * 512 = 8225280 bytes

  Disk identifier: 0x00067588

  Device Boot Start End Blocks Id System

  /dev/sda1 1 95 763056 82 Linux swap / Solaris

  /dev/sda2 * 96 868 6209122+ 83 Linux

  /dev/sda3 869 1958 8755425 83 Linux

  Command (m for help): n

  Command action

  e extended

  p primary partition (1-4)

  e

  Selected partition 4

  First cylinder (1959-2610, default 1959):

  Using default value 1959

  Last cylinder or +size or +sizeM or +sizeK (1959-2610, default 2610):

  Using default value 2610

  Command (m for help): p

  Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders

  Units = cylinders of 16065 * 512 = 8225280 bytes

  Disk identifier: 0x00067588

  Device Boot Start End Blocks Id System

  /dev/sda1 1 95 763056 82 Linux swap / Solaris

  /dev/sda2 * 96 868 6209122+ 83 Linux

  /dev/sda3 869 1958 8755425 83 Linux

  /dev/sda4 1959 2610 5237190 5 Extended

  Command (m for help): n

  First cylinder (1959-2610, default 1959):

  Using default value 1959

  Last cylinder or +size or +sizeM or +sizeK (1959-2610, default 2610):

  Using default value 2610

  Command (m for help): p

  Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders

  Units = cylinders of 16065 * 512 = 8225280 bytes

  Disk identifier: 0x00067588

  Device Boot Start End Blocks Id System

  /dev/sda1 1 95 763056 82 Linux swap / Solaris

  /dev/sda2 * 96 868 6209122+ 83 Linux

  /dev/sda3 869 1958 8755425 83 Linux

  /dev/sda4 1959 2610 5237190 5 Extended

  /dev/sda5 1959 2610 5237158+ 83 Linux

  Command (m for help): w

  6. 用mkfs命令将其格式化为ext3格式。

  mkfs.ext3 /dev/sda5 7. 增加文件夹/opt/sda5。这里增加的文件夹是为了挂载新增加的分区。

  mkdir -p /opt/sda5

  8. 挂载/dev/sda5到/opt/sda5下

  hawkzy:~ #mount /dev/sda5 /opt/sda5

  查看:

  [email=hawkzy@hawkzy]hawkzy@hawkzy[/email]:~> df -k

  Filesystem 1K-blocks Used Available Use% Mounted on

  /dev/sda2 6111520 5433528 367536 94% /

  udev 648032 60 647972 1% /dev

  /dev/sda3 8617868 7008780 1171320 86% /home

  /dev/sda5 5154852 141440 4751556 3% /opt/sda5

  9. 备份/usr文件夹下的文件到/opt/sda5下经过分析/dev/sda2下/usr文件夹非常大,占据3.5G空间,为了释放系统空间,这里考虑将 用新增加的分区作为/usr的镜像。而/opt/sda5挂载的/dev/sda5,空间有5G,足够使用了。

  拷贝/usr下的所有文件到/opt/sda5下:

  cp -r /usr/* /opt/sda5/

  10. 保留/usr文件夹,但是删除/usr下的所有文件,为挂载做准备。

  cd /usr

  rm -rI *

  11. 修改/etc/fstab文件,挂载/dev/sda5到/usr目录下, 添加以下一行

  /dev/sda5 /usr ext3 defaults 1 1

  删除完后重启

  init 6。

  重启后用命令观察是否挂载成功,正常情况下应该能够顺利完成。如果挂载失败,应修改文件/etc/fstab并且用命令mount重新挂载:

  mount /dev/sda5 /usr

  [email=hawkzy@hawkzy]hawkzy@hawkzy[/email]:~> df -k

  Filesystem 1K-blocks Used Available Use% Mounted on

  /dev/sda2 6111520 2780952 3020112 48% /

  udev 648032 60 647972 1% /dev

  /dev/sda3 8617868 7011912 1168188 86% /home

  /dev/sda5 5154852 4675196 217800 96% /usr

如何控制PHP上传文件的大小(转载)

最近有不少提问,我在这里集中解答一下新的站长朋友遇到的问题,在这里重点说明一下。首先你需要有服务器的完全权限才可修改!!
你需要修改php.ini配置文件,该文件在系统目录下(如:C:\windows)
需要在PHP.ini里设置以下几项:
1. post_max_size =10M(根据你的需要设定,单位为M而不是KB)  

表单提交最大数据为10M.此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的.
限制范围包括表单提交的所有内容.例如:发表贴子时,贴子标题,内容,附件等…

2.file_uploads = On    (On为开启php下的文件上传,Off为关闭)

是否允许上传文件,如果为OFF您将不能上传文件.

3.upload_tmp_dir = “D:/APM/PHP/uploadtemp/” (根据需要自行设定,但是不建议设定在系统所载的分区)

上传文件时系统使用的缓存目录.如果此目录所在磁盘空间不足的话您将不能上传文件.

4.upload_max_filesize =2M   (根据你的需要设定,单位为M而不是KB)

最大上传文件大小,此项针对上传文件时单个文件的大小.

upload_max_filesize与post_max_size之间的关系:
在论坛发表贴子时,您post_max_size 设为10M,而此项设成了2M,那么您只能上传最大为2M的附件,且可以同时上传5个.

最后一定不要忘记从新启动WEB服务(IIS或者APACHE)

注意:很多人遇到修改php.ini后重应WEB服务后仍然不能生效.这种情况应该先确认一下所改的php.ini是不是当前PHP所使用的.
您可以在WEB目录下建立一个php文件,内容很简单就一句话

  1. phpinfo();
  2. ?>

或者你可以直接下载[异度冰晶]PHP探针,这是一个功能很强大的php探针。

浏览器中查看此文件, Configuration File (php.ini) Path 此项对应的就是您的PHP当前正在使用的php.ini文件了.

转载自(http://www.chuanfuyin.org/html/texulanmu/2009/0225/112.html