存档

2008年9月 的存档

Ubuntu中的Load/Unload Cycle Count问题及解决方案

2008年9月29日 没有评论

说明:请大家注意,本文所描述的问题只有笔记本电脑才会出现。

1. 问题描述

几周前收到soldiers童鞋的短信说,Ubuntu伤硬盘?我说没事,好多人都用呢。过了一周,soldiers童鞋又问,Ubuntu伤硬盘?我说我查查看….

# 安装smart参数查看工具,由此可以查看硬盘的smart信息
$ sudo apt-get install smartmontools

# 查看/dev/sda这块硬盘的smart参数, 你可能需要把/dev/sda这部分修改成你的硬盘设备地址
# grep 193是只查看 Load Cycle Count这项

$ sudo smartctl -a /dev/sda | grep 193
193 Load_Cycle_Count 0×0012 090 090 000 Old_age Always – 109989

这样就可以看到Load/Unload Cycle Count数目了。用Windows的童鞋可以借助Everest工具,查看存储器->SMART信息,也可以找到相应项的数据。

不看不知道,一看吓一跳,我的是华丽的11W!!! T.T 据说到了60W,就离挂掉不远了。我才用了4个月,算下来照这个速度用下去的话,只能用4*60/10/12=2年…. 同寝的Acrest童鞋的也过了10W大关哈哈哈。

$ while true; do sudo smartctl -a /dev/sda | grep 193; sleep 300; done;

这样可以每隔5分钟查询一下LCC,一般来说每小时增长在15上下应该是正常的。这样的话即便你每天24小时开着本子,硬盘也可以坚持4年(当然是从理论上来讲)。

1.1 这个Load/Unload Cycle Count到底是什么?

Load/Unload Cycle Count(以下简称为LCC)就是Load/Unload的次数,那么什么叫做Load/Unload呢,下面是一段非常罗嗦的解释,建议不感兴趣的同学出门右转,直接看下一节吧。

大家都知道,硬盘的数据传输是通过磁头读写磁盘上的数据来完成的。在工作过程中,磁头并不与磁盘的盘面直接接触,两者之间有一层很薄的空气薄膜,这层空气薄膜是由于磁盘的高速旋转产生的。如果磁盘停止旋转,空气薄膜消失,磁头则会直接接触到盘片,更详细一点说,会接触到盘片的landing zone,或者叫做start/stop zone,这无疑对盘片的寿命以及对存储在这块区域的数据造成不好的影响。因此在早期阶段,硬盘制造商一般会在对盘片的表面或landing zone部分做特殊的处理,并尽量避免在landing zone存储数据。

但是随着人们对于硬盘传输速度和硬盘容量需求的不断增加,制造商需要不断提高硬盘的面密度,同时要求盘片表面尽可能地平滑,这无疑与之前采用的技术产生了冲突,再加上其他的一些因素,硬盘制造商迫切地需要一种新的方式来替代之前采用的磁头直接接触盘面的行为。这时IBM的工程师们提出了一种叫做Load/Unload的技术。简单来说,Load/Unload技术有点像老式的点唱机,当盘片转速降低无法再产生空气薄膜的时候,就将磁臂以及磁头旋转一下,停靠到磁盘旁边的一个小斜坡上。这样就完全避免了磁头与盘片的直接接触。

总体来说,Load/Unload技术是有利的,比如可以提高硬盘的可靠性:硬盘遭到撞击的时候磁头不会划伤盘面;可以提高硬盘的面密度:不再需要对盘片表面做特殊的处理,可以提供平滑的盘面;以及可以有效地降低功耗:低功耗的程序可以通过多次请求Load/Unload来减少盘片的旋转时间,或者设置旋转超时时间(spin down timeout)来让磁头定期的做Load/Unload等等。

1.2 这个参数值高了有啥危害?

虽然Load/Unload技术有很多优点,但毫无疑问频繁的Load/Unload操作会造成磁头的磨损,严重的话会造成数据读写失效,也就说,硬盘挂了。

那么到底Load/Unload多少次会挂呢?最流行的说法是到60W次,西部数据的一份产品规格说明书上也明确标示出了这一数字。

但也有人指出SMART参数根本就是扯淡,好多坏掉的硬盘SMART值很低好的硬盘SMART值超标,因此根本不能成为评判标准以至于现在好多新机器都直接屏掉。但无论如何,频繁地卸载/挂载总不是什么好事。尤其是当你已经了解到Load/Unload次数过多有可能造成硬盘挂掉的时候,我想无论再有人辟谣,你也不会高枕无忧了。毕竟相对于硬盘本身来说,上面的数据可是要重要的多。

1.3 LCC为啥会那么高?

简单来说,可能有下面几个原因:

1) 硬盘厂商在固件中制定的节能策略过于苛刻,以至于为了节能,硬盘频繁地Load/Unload
2) 操作系统的电源策略过于苛刻。

1.4 其他的发行版有没有这个问题?Windows呢,MAC OS呢?

各大linux发行版好像就Ubuntu被报告有这个问题,但这实际上并不是Ubuntu的电源策略太变态,恰恰相反,默认情况下Ubuntu会直接沿用硬件固件里面的设定。其他的发行版中SUSE也有类似的电源管理的BUG,除此之外的发行版似乎默认会忽略硬盘的这个节能功能,所以不会有类似的问题。

至于Windows,也会出现类似的现象,比如说我宿舍的Acrest童鞋,但我的没有。MAC OS也有报告出现类似的问题。

总体来说这个并不是个别现象,也并不应该算是操作系统的问题。感觉由于Windows下硬盘几乎会一直不停地运作,所以硬件厂商不太重视硬盘固件中的初始设定,比如说我的日立硬盘,电源管理级别被设置为128,结果由于Linux并不像Windows那样频繁读盘,磁头为了节能会频繁地做 Load/Unload操作。

2. 如何修复这个问题?

2.1 硬件修改法 (***推荐使用***)

正如上面所说,如果你的硬盘在Ubuntu下有这个问题,那么有可能是硬件本身的节能策略太激进了。最简单也是最根本的方法,就是用厂商提供的固件修改工具对出厂的默认设置进行修改,比如说日立的Feature Tools。

在Feature Tools中,有一项”Change Advanced Power Mode”,默认是128,可以选择从1到254不同的数值。

简单来说,数字越小越节能,数字越大性能越好。Feature Tools中将1-254分成三段并分别做了简单的说明,一般来说,设置到192-254则表示不允许Load/Unload操作,而255则表示禁用APM()。这个数字也就是后文提到的APM级别。

2.2 软件修改法

修改硬盘固件是最根本的解决方案,除此之外,关于在Ubuntu中修改相关策略,网上有很多种不同的解法,有兴趣的童鞋可以看关于这个Bug的讨论, Ubuntu Wiki上关于这个Bug的介绍,起因分析以及解决方案的总结等。基本上流传的方法有这么两种:

2.2.1 启用laptop-mode,通过修改laptop-mode.conf中的相关设置达到控制Load/Unload的目的

2.2.2 直接在/etc/acpi/start.d, resume.d等目录下放置脚本,通过hdparm命令修改APM级别和spin down time.

具体内容见文后附注。归根结底,这两种方法都是利用hdparm工具,通过-B参数修改高级电源管理(APM)级别,通过-S参数修改旋转超时时间 (Spin Down Timeout),从而控制硬盘的Load/Unload次数。所谓APM级别就是我们上面介绍过的1~255,而Spin-down Timeout就是指硬盘空闲(或者旋转?这个拿不准)多久后才会Spin Down,也就是停转,做Unload操作。相对应的,有一个Spin up Time,这是指硬盘重新启动到正常运转所需要的时间。

Windows下也有一款HDDScan软件可以很方便地做到这一点。这样的软件改法确实有效,但由于hdparm不会将设置写入固件,因此在关机、休眠以及待机之后,由于硬盘掉电,这些通过软件的设置会失效,需要重新启用一次。目前这两种方法在我的机器上的测试结果是待机唤醒之后参数不会重新启用。实际上,laptop-mode只会在开机的时候才会应用我们设定的参数,而 acpi的resume.d目录下放置的脚本并不会被执行,不知道这是不是个别现象。 所以如果大家非要用软件的修改方法时,推荐下面这一种。

2.2.3 pm.utils大法 (推荐使用)

除了这两种修改方法之外,还有另外一种通过pm.utils来调用hdparm的方法。这实际上是Suse的一个解决方案。pm.utils全称是 Power Management Utilities,与acpi类似,它可以通过加入Hook脚本的方法在待机、休眠和唤醒的时候修复一些待机/休眠方面的Bug或者实现某些特定的功能。pm.utils很有可能会在8.10中就取代acpi,所以从这个意义上来讲这个方案也会有更长的效用。具体步骤如下:

1) 首先做一些配置,主要就是设置省电模式开启和关闭的模式下hdparm的参数,具体的内容脚本中有注释。

你可能需要将“/dev/sda”修改成你的硬件设备,比如你有两个硬盘,可以修改为”/dev/sda /dev/sdb”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ sudo vi /etc/pm/config.d/disk
 
# Configure disk power management settings to ensure both
# long disk life and good power management.
#
# Space delimited list of disk devices this affects.
#
DEVICES_DISK_PM_NAMES="/dev/sda"
#
#
# Power management modes
#
# Powersave mode off
# Set APM as 192
# Set spin-down for 30 minutes
#
DEVICES_DISK_PM_POWERSAVE_OFF="hdparm -q -B 192 -q -S 241 -q -M 128"
#
# Powersave mode on
# Enable APM to conservative 192 and set spin-down for 21 minutes
#
DEVICES_DISK_PM_POWERSAVE_ON="hdparm -q -B 192 -q -S 252 -q -M 128"

2) 在power.d中加入Hook脚本,作用是在使用电池和AC电源的时候可以自动切换省电模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ cd /etc/pm/power.d
$ sudo vi disk
 
#!/bin/bash
. /usr/lib/pm-utils/functions
. /etc/pm/config.d/disk
 
if test -z "${DEVICES_DISK_PM_NAMES}"; then
exit 1
fi
 
case "$1" in
true)
echo "**enabled pm for harddisk"
for DISK_NAME in `echo ${DEVICES_DISK_PM_NAMES}`; do
${DEVICES_DISK_PM_POWERSAVE_ON} ${DISK_NAME}
done ;;
false)
echo "**disabled pm for harddisk"
for DISK_NAME in `echo ${DEVICES_DISK_PM_NAMES}`; do
${DEVICES_DISK_PM_POWERSAVE_OFF} ${DISK_NAME}
done ;;
esac
 
$ sudo chmod +x disk

3) 在sleep.d中加入脚本,目的是在休眠/待机之后唤醒的时候重新设定hdparm的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cd /etc/pm/sleep.d/
$ sudo vi disk
 
#!/bin/bash
. /usr/lib/pm-utils/functions
. /etc/pm/config.d/disk
 
if test -z ${DEVICES_DISK_PM_NAMES}; then
exit 1
fi
 
case "$1" in
thaw|resume)
/usr/bin/on_ac_power;
if [ "$?" -eq 0 ]; then
echo "**disabled PM for harddisk"
for DISK_NAME in `echo ${DEVICES_DISK_PM_NAMES}`; do
${DEVICES_DISK_PM_POWERSAVE_OFF} ${DISK_NAME}
done
elif [ "$?" -eq 1 ]; then
echo "**enabled PM for harddisk"
for DISK_NAME in `echo ${DEVICES_DISK_PM_NAMES}`; do
${DEVICES_DISK_PM_POWERSAVE_ON} ${DISK_NAME}
done
fi
;;
esac
 
$ sudo chmod +x disk

***注意最后一定要为disk脚本添加执行权限。否则pm.tuils不会自动执行这段脚本

4) 如果你没有启用laptop mode (默认是不启用的),可以跳过这部分了。

由于Ubuntu中acpi和pm.utils是共存的,所以如果你启用了laptop mode,那么在改变电源状态(指电池->AC电源或者反之)的时候,acpi会在启用/停用laptop mode的同时设置hdparm参数,会覆盖掉pm-utils所做的设置。

所以如果你启用了laptop mode的话,需要做如下修改:

1′ $ sudo vi /etc/default/acpi-support

将最后的

SPINDOWN_TIME=12

修改为

SPINDOWN_TIME=241

2′ $ sudo vi /etc/acpi/power.sh

将function laptop_mode_enable部分的

$HDPARM -B 1 /dev/$drive 2>/dev/null

修改成

$HDPARM -B 192 /dev/$drive 2>/dev/null

上述的解决方案在Dell Inspiron 700m + Ubuntu 8.04.1上测试通过。在待机唤醒之后参数会重新被设置,但是由于我的机器上休眠有问题,所以没有办法测试休眠。但理论上来也是可以的。

3. 我想定期检测Load_Cycle_Count,怎么办?

好办,这里是一个脚本,具体用法在注释里面粗体标明了。(不好意思…注释好像比代码都长)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash
#
# @Description:
#
# check_lcc v0.2
#
# Check Load_Cycle_Count from S.M.A.R.T info of your hard drive
# when power on and off and Save them to $FILE in following format:
#
# LCC TIME
# ON 110044 18:05:00 2008-09-08
# OFF 110044 18:10:03 2008-09-08
#
# "ON" indicates POWER ON while "OFF" indicates POWER OFF, LCC is
# exactly Load_Cycle_Count of your hard drive at TIME.
#
# @Usages:
#
# 1. sudo vi /etc/init.d/check_lcc
# 2. copy all the contents of this script to it
# *** Note that u need to modify "FILE" as what u want.
# save and quit.
# 3. sudo chmod +x /etc/init.d/check_lcc
# 4. sudo update-rc.d check_lcc start 1 2 . stop 99 0 6 .
# 5. Have fun.
#
# This script was tested under Ubuntu 8.04.1.
#
# @Author:
#
# breaddawson@gmail.com
# 2008/09/07
 
FILE="/home/bread/lcc_report.txt"
STAT=`smartctl -a /dev/sda | grep 193 | sed -nr "s/.*[[:space:]]([[:digit:]]{1,})$/\1/p"`"\t "`date +'%T %F'`
 
case "$1" in
start)
STAT="ON \t"$STAT
;;
stop)
STAT="OFF\t"$STAT
;;
*)
echo "Usages: $0 {start|stop}" >&2
exit 2
;;
esac
 
echo -e $STAT >> $FILE

按照上面的说明操作之后,LCC的结果就会存在你定义的log文件里面了。可以定期打开查看。

4. 最后附上之前的两种方法,启用laptop mode和添加acpi脚本。

4.1. 加入acpi脚本

1) 为使用电源和电池的时候定制不同的hdparm参数。你可能需要把/dev/sda修改成你的硬盘设备。

1
2
3
4
5
6
7
8
9
10
11
$sudo vi 99-hdd-ugly-fix.sh
 
#!/bin/bash
if on_ac_power; then
# on AC so don't do any head parking
hdparm -B 254 /dev/sda # you might need 255 or a different value
else
# either on battery or power status could not be determined
# so quickly park the head to protect the disk
hdparm -B 192 /dev/sda
fi

2) 将如上脚本安装到如下4个地方

1
2
3
4
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/resume.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/start.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/ac.d/
$sudo install 99-hdd-ugly-fix.sh /etc/acpi/battery.d/

这个方案比开启laptop简单且方便。因此如果你实在是不想用pm.utils的时候,推荐使用这种方法。

4.2. 启用laptop mode

Ubuntu 8.04测试有效,但是待机/休眠唤醒之后设置会丢失。laptop mode 模块在Ubuntu 8.04中是默认包含的,只是没有启用。下面是具体的设置方法。

1) /etc/default/acpi-support中修改

# 启用laptop模式
ENABLE_LAPTOP_MODE=true

# 将spin down 时间改成 (241-240)*30min = 30min
# spin down time决定硬盘闲置多久以后关闭主轴电动机以节省功耗,0表示永远不关闭
# 具体的解释看 man hdparm的-S部分
SPINDOWN_TIME=241

2) /etc/laptop-mode/laptop-mode.conf中修改

# 即便是接上电源也用laptop mode
ENABLE_LAPTOP_MODE_ON_AC=1

# 显示器关闭的时候也用laptop mode
ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=1

# 让laptop mode控制硬盘闲置多长时间才卸载
CONTROL_HD_IDLE_TIMEOUT=1

# 改成半小时
LM_AC_HD_IDLE_TIMEOUT_SECONDS=1800
LM_BATT_HD_IDLE_TIMEOUT_SECONDS=1800
NOLM_HD_IDLE_TIMEOUT_SECONDS=7200

# 让laptop mode来控制硬盘的电源管理
CONTROL_HD_POWERMGMT=1

# 192表示不关闭,从128-254都表示不关闭,越大能耗越大
# 具体可以 man hdparm 看-B
BATT_HD_POWERMGMT=192
LM_AC_HD_POWERMGMT=254
NOLM_AC_HD_POWERMGMT=254

3) /etc/acpi/power.sh中

把 “$HDPARM -B 1 /dev/$drive 2>/dev/null”
修改为 “$HDPARM -B 192 /dev/$drive 2>/dev/null”

4) 禁用pm.utils的部分功能

$ sudo chmod -x /usr/lib/pm-utils/power.d/laptop-tools

否则laptop-mode不会随机启动。

5) 重启后,cat /proc/sys/vm/laptop_mode

结果是2表示laptop-mode已经启动,是0表示还未启动,请仔细检查上面的设置是否有遗漏。

###############我是很郁闷的分割线###############

附:关于为啥要禁用pm.utils,具体的解释如下:

我从网上找到了laptop mode的解决方案之后,按照说明一步步操作,但是重新启动之后,查看cat /proc/sys/vm/laptop_mode,发现仍然是0.(是2才表示已经启动)。查看/etc/rc2.d/目录下确实有 S99laptop-mode,这说明系统确实会加载这个服务(这个目录下的文件都是个符号链接,会链接到/etc/init.d目录下的同名脚本)。后来Google了一下发现这样的解释:

首先来说/proc/sys/vm/laptop_mode这个变量和初始化进程laptop-mode并不是一个意思。前者是个内核控制的变量,作用是将磁盘写操作聚簇,后者是一个脚本。

其次,Hardy加入了pm-utils,会覆盖或忽略一部分根据linux传统的配置。为了解决这个问题,可以修改/usr/lib/pm-utils/power.d/laptop-tools中相关的内容或者运行下述命令:

$ sudo chmod -x /usr/lib/pm-utils/power.d/laptop-tools

这条命令会禁用pm-utils的部分功能,从而修复你所遇到的问题(指laptop-mode不会随机启动)。注意得重启以后设置才会生效。

实际上pm-utils盲目地覆盖掉laptop-mode或者是/etc/sysctl.conf中的配置,所以chmod -x禁用相关脚本后, 在从AC POWER转到电池供电的时候,pm-utils就不会执行相关的脚本(laptop-tools),从而也就不会覆盖相关的设置。这种做法改动最小,如果之后你想重新启用pm-utils的这部分功能,只需要chmod +x就可以了。

###############很郁闷的分割线又来啦###############

5. 最后是References:

日立关于Load/Unload技术的解释: Load/Unload白皮书下载
StorageView关于Load/Unload技术的解释:http://www.storagereview.com/guide2000/ref/hdd/perf/qual/featuresHead.html
西部数据的规格:http://www.wdc.com/en/library/portable/2879-001121.pdf
日立的Feature Tool下载:http://www.hitachigst.com/hdd/support/download.htm#FeatureTool
Bug报告页面: https://launchpad.net/bug59695.html
Ubuntu Wiki的Bug总结:https://wiki.ubuntu.com/DanielHahler/Bug59695
Ubuntu Dev解释:http://www.advogato.org/person/mjg59/diary/82.html
laptop mode的解决方案:https://launchpad.net/ubuntu/+source/acpi-support/+bug/59695/comments/63
acpi的解决方案:http://ubuntuforums.org/showthread.php?p=5031046
Suse的解决方案:http://en.opensuse.org/Disk_Power_Management
休眠后重新设置pm.utils的方案:https://bugs.launchpad.net/ubuntu/+source/pm-utils/+bug/235105
pm.utils的wiki:http://pm-utils.freedesktop.org/wiki/
Suse的pm.utils介绍:http://en.opensuse.org/Pm-utils
CnBeta的报道:http://www.cnbeta.com/articles/42191.htm
CnBeta的一个总结:http://www.cnbeta.com/articles/42421.htm
国内用户的一个解决方案: http://lymanrb.blogspot.com/2008/01/loadunload-bug.html
Ubuntu中文论坛的讨论: http://forum.ubuntu.org.cn/viewtopic.php?p=555500
关于laptop mode和pm.utils冲突的解释:http://ubuntuforums.org/showthread.php?t=867728
Windows下修改硬盘APM和Spin-down time的工具:http://hddscan.com/

6. 最最后

折腾这个问题费了我一整天(实际上是半天,不过那天我中午才起…),总结这些破烂方法,再加上反复试验确定某个方法是否有效,硬着头皮分析脚本的功能,零零碎碎加起来也有一整天的时间,再加上写这篇总结,又花去一整天加上两节入学教育的时间(罪过啊罪过啊)。到此为止距离开始解决这个问题就已经过去整整一周了。就这还没总结全,好多东西都还没有写上来。不过倒是学到了不少东西,硬盘的原理是确确实实复习了一遍了又,另外学了些写Shell脚本的技巧以及 ACPI和pm.utils的机制。感觉系统里面同时有俩搞电源管理的东西实在是太FT了,因为会有冲突的部分,好在据说Intrepid要搞掉acpi 只用pm.utils,也许会清净一些。

无论如何总算是写完了。一边实验一边记录,一度想放弃了(实在是太费时间,感觉也没太大的意义),但一个是为了我的宝贝硬盘考虑(钱啊钱啊!),又觉得折腾了那么多不记录下来,功夫不就都白费了。正好今天有两节入学教育,于是就勇敢地抱本过去,写完最后一段哈哈哈。

贴到这里,希望会对遇到这个问题的人有所帮助。

[原文链接]

版权声明: 允许非商业性转载,但转载时必须标明作者及原文链接.
本文网址: http://linuxtoy.org/archives/ubuntu-harddisk.html

分类: linux相关 标签: , ,

pureftpd+mysql登陆后自动断开解决

2008年9月29日 没有评论

最近迁移的机器多了,碰到的问题也就多。这个pureftpd+mysql就把我折腾了1天
症状就是登陆ftp后输完用户名和密码,ftp链接立刻就断开了
[00:14:19] [R] 正在连接到 10.130.128.146 -> IP=10.130.128.146 PORT=21 (次尝试 # 5)
[00:14:19] [R] 已连接到 10.130.128.146
[00:14:19] [R] 220---------- Welcome to Pure-FTPd ----------
[00:14:19] [R] 220-You are user number 1 of 25 allowed.
[00:14:19] [R] 220-Local time is now 00:13. Server port: 21.
[00:14:19] [R] 220-This is a private system - No anonymous login
[00:14:19] [R] 220 You will be disconnected after 15 minutes of inactivity.
[00:14:19] [R] USER user89
[00:14:19] [R] 331 User user89 OK. Password required
[00:14:19] [R] PASS (hidden)
[00:14:19] [R] 连接失败 (连接丢失)

注意这提示并非用户名密码错误。用户验证已经通过了。结果噩梦开始了,其实解决很简单,只要mysql里取出来的用户uid&gid和用户主目录的uid&gid对应就行。我一开始想到过这个问题,结果editplus里开了2个conf,我改的一个,结果上传的另一个….我的天,我晚上在家从头开始配的时候竟然犯了同样的错误,绕了一大圈弯路,最后关配置文件打算用puredb才发现这个问题。

具体修改pureftpd-mysql.conf
# Query to execute in order to fetch the system user name or uid
# MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
# Optional : default UID - if set this overrides MYSQLGetUID
MYSQLDefaultUID 501
# Query to execute in order to fetch the system user group or gid
# MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
# Optional : default GID - if set this overrides MYSQLGetGID
MYSQLDefaultGID 501

我这所有用户目录所有者都是www:www,所以对照下etc/passwd里面www的uid和gid直接定义了MYSQLDefaultUID和MYSQLDefaultGID。不取mysql的

这里推荐个不错的pureftpd教程
Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota How To

http://netkiller.8800.org/article/ftpserver/

汗。。。看来最近迁移的服务器太多搞得头晕了,竟然是这种低级错误。看来国庆长假要好好休息了。

centos5默认网关大搜捕

2008年9月28日 没有评论

centos里面能加网关的地方太多了,有的时候往往会死改活该怎么也改不了网关。这里总结下
默认网关通常由如下配置文件决定
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/route-eth0
/etc/sysconfig/static-routes
还不知道有没有别的地方了,以后知道了再加

分类: linux相关 标签: ,

centos关闭ipv6不能忘记/etc/sysconfig/network

2008年9月28日 没有评论

redhat系列的linux 关闭ipv6通常就是在 /etc/sysconfig/network里加入
alias net-pf-10 off

其实还有个地方得留意就是/etc/sysconfig/network
加入里面的NETWORKING_IPV6=yes 的话那/etc/sysconfig/network再改也是没用的。

分类: linux相关 标签: ,

mysql 4.0 数据快速转换到 5.0

2008年9月25日 5 条评论

今天在做服务器搬迁,新的主机使用的mysql5.0,一开始直接把data目录复制了过去,结果发现所有char相关字段长度全部变成原来的一半。无奈只好用dump了
我这的环境都是gbk所以下面是以gbk为例子
导出:

1
mysqldump -u xxx -pxxx --skip-extended-insert --default-character-set=gbk db1 > d:\db1.sql

导入:

1
mysql.exe -u xxx -pxxx --default-character-set=gbk db1 < d:\db1.sql

由于4.0是没有编码设置,所以在新的5.0上面要设置mysql的conf把default-character-set=gbk,character-set-server=gbk

这样就能解决一般经常碰到的乱码问题了

当然导入过程中可能会有一些错误提示,根据提示修改下导出的sql文件就行。一般比如group这类特殊字段名要改成`group`才能正确导入到5.0。建议使用notepad++来编辑sql文件

分类: mysql相关 标签:

PHP 中执行排序与 MySQL 中排序

2008年9月21日 没有评论

Q:列出在 PHP 中执行排序要优于在 MYSQL 中排序的原因?给一些必须在MYSQL中排序的实例?

A:通常来说,执行效率需要考虑 CPU、内存和硬盘等的负载情况,假定 MYSQL 服务器和 PHP 的服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived Performance)是我们追求的主要目标。在实际运行中,MYSQL 中数据往往以 HASH tables、BTREE 等方式存贮于内存,操作速度很快;同时 INDEX 已经进行了一些预排序;很多应用中,MYSQL 排序是首选。而在应用层(PHP)中排序,也必然在内存中进行,与 MYSQL 相比具有如下优势:

  • 1、 考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存、CPU,如果并发的排序很多,DB 很容易到瓶颈。
  • 2、 如果在应用层(PHP)和MYSQL之间还存在数据中间层,合理利用,PHP会有更好的收益。
  • 3、 PHP在内存中的数据结构专门针对具体应用来设计,比数据库更为简洁、高效;
  • 4、 PHP不用考虑数据灾难恢复问题,可以减少这部分的操作损耗;
  • 5、 PHP不存在表的锁定问题;
  • 6、 MYSQL中排序,请求和结果返回还需要通过网络连接来进行,而PHP中排序之后就可以直接返回了,减少了网络IO。

至于执行速度,差异应该不会很大,除非应用设计有问题,造成大量不必要的网络IO。另外,应用层要注意PHP 的 Cache 设置,如果超出会报告内部错误;此时要根据应用做好评估,或者调整Cache。具体选择,将取决于具体的应用。

列出一些 PHP 中执行排序更优的情况:

  • 1、 数据源不在 MYSQL 中,存在硬盘、内存或者来自网络的请求等;
  • 2、 数据存在 MYSQL 中,量不大,而且没有相应的索引,此时把数据取出来用PHP排序更快;
  • 3、 数据源来自于多个 MYSQL 服务器,此时从多个 MYSQL 中取出数据,然后在PHP中排序更快;
  • 4、 除了 MYSQL 之外,存在其他数据源,比如硬盘、内存或者来自网络的请求等,此时不适合把这些数据存入 MYSQL 后再排序;

列出一些必须在 MYSQL 中排序的实例:

  • 1、 MYSQL 中已经存在这个排序的索引;
  • 2、 MYSQL 中数据量较大,而结果集需要其中很小的一个子集;比如 1000000 行数据,取TOP 10;
  • 3、 对于一次排序、多次调用的情况,比如统计聚合的情形,可以提供给不同的服务使用,那么在 MYSQL 中排序是首选的。另外,对于数据深度挖掘,通常做法是在应用层做完排序等复杂操作,把结果存入MYSQL即可,便于多次使用。
  • 4、 不论数据源来自哪里,当数据量大到一定的规模后,由于占用内存/Cache 的关系,不再适合 PHP 中排序了;此时把数据复制、导入或者存在 MYSQL ,并用 INDEX 优化,是优于 PHP 的。不过,用 Java,甚至 C++ 来处理这类操作会更好。 [有些类似大数据集聚合或者汇总的数据,在客户端排序得不偿失。当然,也有用类似搜索引擎的思路来解决类似应用的情况。]

从网站整体考虑,就必须加入人力和成本的考虑。假如网站规模和负载较小,而人力有限(人数和能力都可能有限),此时在应用层(PHP)做排序要做不少开发和调试工作,耗费时间,得不偿失;不如在 DB 中处理,简单快速。对于大规模的网站,电力、服务器的费用很高,在系统架构上精打细算,可以节约大量的费用,是公司持续发展之必要;此时如果能在应用层(PHP) 进行排序并满足业务需求,尽量在应用层进行。

–EOF–

分类: mysql相关, php相关 标签: , ,

最常用和实用的CSS技巧

2008年9月18日 没有评论

下面是CSS最常用和实用的技巧。 


1.重置浏览器的字体大小
 
重置浏览器的默认值 ,然后重设浏览器的字体大小你可以使用雅虎的用户界面重置的CSS方案 ,如果你不想下载9MB的文件,代码如下: 

body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,
blockquote,th,td {margin:0; padding:0; }
table { border-collapse:collapse; border-spacing:0; }
fieldset,img { border:0; }
address,caption,cite,code,dfn,em,strong,th,var { font-style:normal; font-weight:normal; }
ol,ul { list-style:none; }
caption,th { text-align:left; }
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
q:before,q:after { content:”; }
abbr,acronym { border:0; }

其次,我们重设浏览器字体的大小为10像素,使用如下: 

html {font-size: 62.5%;}

这个大小基本合适,然后您可以根据自己的需要调整大小,如 标题1为120像素: 

h1 {font-size: 2em;}


2.设置水平居中
 
大多数的网站目前都是固定宽度的。CSS代码如下: 

div#container {margin: 0 auto;}

3.控制位置:绝对位置,相对位置 
假如有两个div 

<div id='parent'>
<div id='son'></div>
</div>

div有left和top属性,是用来定位的. 
如果内层的div的position属性是absolute.那他就是相对于文档的左上角的位置.. 
如果内层的div(id为son的那个)position属性为relative,那它的left和top值就是相对于外层的div的左上角的距离. 


4.将重要元素放置在屏幕中央
 
如果你希望将您想要的东西放在最中央,可以使用以下CSS: 

div.popup { height:400px; width:500px; position: absolute; top: 50%; left: 50%;}
div.popup { margin-top: -200px; margin-left: -250px;}

您必须明确的指定宽度和高度,再把top和left属性设为他们的一半,这样就可以是这个部分回到屏幕的中心。 


5.可以重复利用的规则
 

.left {float: left;}
.right {float: right;}
img .left { border:2px solid #aaaaaa; margin: 0 10px 0 0;}
img .right { border:2px solid #aaaaaa; margin: 0 0 0 10px; padding: 1px;}

设置自己的CSS样式表,就可以在您需要的时候直接的添加标记即可。 
 


6. 解决IE6 的浮动元素的双倍边距问题
 
对一个div设置了float:left 和 margin-left:100px 那么在IE6中,这个bug就会出现。您只需要多设置一个display即可,代码如下: 

div {float:left;margin:40px;display:inline;}

7.简单的导航菜单 
在您的设计中预设一个导航栏是非常有益的。可以让别人对你网页的主要内容有一个大致的了解。第一次来的XHTML: 

<div id=”navbar”>
<ul>
<li><a href=”http://www.peakflowdesign.com”>Peakflow Design</a></li>
<li><a href=”http://www.google.com”">Google</a></li>
<li><a href=”http://zenhabits.net/”>Zen Habits</a></li>
</ul>
</div>

CSS代码: 

#navbar ul li {display:inline;margin:0 10px 0 0;}
#navbar ul li a {color: #333;display:block;float:left;padding:5px;}
#navbar ul li a:hover {background:#eee;color:black;}


8.不使用table的form表单
 
正如我们现在进行网站设计的table-free,把重点是放在使用DIVs上。不再对表的列和域进行约束,所以我们需要一些好用的CSS,在JeddHowden.com 发现 

XHTML:
<form action=”form.php” method=”post”>
<fieldset>
<legend>Personal Information</legend>
<div>
<label for=”first_name”>First Name:</label>
<input type=”text” name=”first_name” id=”first_name” size=”10″ value=”" />
</div>
<div>
<label for=”last_name”>Last Name:</label>
<input type=”text” name=”last_name” id=”last_name” size=”10″ value=”" />
</div>
<div>
<label for=”postal”>Zip/Postal Code:</label>
<input type=”text” name=”postal” id=”postal” size=”10″ value=”" />
</div>
</fieldset>
</form>
CSS:
form div {clear:left;display:block;width:400px;zoom:1;margin:5px 0 0 0;padding:1px 3px;}
form div label {display:block;float:left;width:130px;padding:3px 5px;margin: 0 0 5px 0;text-align:right;}


9.让footer总是停留在页面的底部
 
在网页的底部总是保留着公司的版本信息,如何是这部分信息来实现呢?这是一个很古老的技术,这都要归功于The Man in Blue  

XHTML:
<body>
<div id=”nonFooter”>
<div id=”content”> *Place all page content here* </div>
</div>
<div id=”footer”> *Place anything you want in your footer here*
</div>
</body>

 

CSS:
html, body { height: 100%; }
#nonFooter { position: relative; min-height: 100%; }
* html #nonFooter { height: 100%; }
#content { padding-bottom: 9em; }
#footer { position: relative; margin-top: -7.5em; }

10.在同一元素上使用多种类 
随着有用的功能越来越多的,大多数的人都忽略了内部CSS的选择。一个元素可以套用很多的类,例如: 

.red {color: red;}
.bold {font-weight: strong;}

我们可以运用它: 

<p class=”red bold”>This text will be red yet also bold!</p>

希望这些能对您有所帮助! 

摘自:http://www.phpv.net/html/1629.html

分类: 只谈技术 标签:

netapp重复数据删除,vmware的绝配

2008年9月16日 没有评论

今天在新建设vmware平台的netapp存储上面尝试打开重复数据删除功能。
具体如何打开请看我另外一篇博文http://226617.cn/index.php/archives/170
环境是5台10g的linux虚拟机。占用空间50g,做了重复数据之后的结果
FAS2050A> df -sh
Filesystem used saved %saved
/vol/vola1/ 3052MB 47GB 94%

看完成之后只占用了3g空间,空出了47g。节约了达到94%的空间。这个数据真是恐怖啊

在打开的sis的时候还发现一个莫名奇妙的问题
FAS2050A> sis on /vol/vola1
Volume or maxfiles exceeded max allowed for SIS: /vol/vola1

一开始以为volume太大了,后来修改后发现还是这样提示,把另外一个机头的完全一样的volume试了下打开sis却完全没问题。
最后赶时间,把数据挪了下位置把整个volume重新建了下,就正常了。真是奇怪的问题。

如何在vmware esx创建动态增长磁盘

2008年9月16日 没有评论

动态增长磁盘可以给测试vm带来很大的方便,因为是用了多少vmdk的文件才是多少,而不是设定的大小一次性占满的。
在vmware workstation里面可以很方便的把allocate all disk sapce now 的钩去掉就可以了。

如果想在ESX下实现虚拟硬盘的动态增长,可以通过以下方法:
1 cli : vmkfstools -c xxG -d thin xxxxx.vmdk
(手动创建虚拟磁盘时,加-d thin参数就可以实现磁盘的动态增长)
2 在vm添加虚拟硬盘,指定使用已存在的硬盘,指向刚才创建的磁盘文件

分类: vmware相关 标签:

vmware tools安装提示What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include]解决

2008年9月14日 没有评论

What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include]

这个是由于需要内核源代码进行编译,可能之前还会碰到需要gcc编译器的提示。
解决办法就是安装下,这里以redhat系列为例子。最新的版本可能命名和以前不一样,我也折腾了半天

yum -y install gcc kernel-devel

注意如果用的是PAE内核的kernel的话要装 kernel-PAE-devel。我就是在这里卡了半天晕乎。

还有一些朋友可能更新了kernel没有重启机器,所以最好先看下uname -r,如果版本和自己机器上的不对就重启下机器。我有一台机就是这样,更新了一直没重启,然后kernel-devle又装的是新内核的,死活装不上vmware tools结果发现每重启,vmware tools认到的kernel是目前运行的,又找不到对应的kernel-devel。

装完vmware tools 记得立刻把network 重启一边,不然网是不通的。

分类: vmware相关 标签: ,