存档

文章标签 ‘linux’

如何在repair filesystem下面修改文件

2009年3月26日 没有评论

今天在把一台cdn重新安装成64位系统,vm上划了台新机器就把挂在老的机器上的存储lun删除后挂在新的机器上,结果下午准备把老的cdn拿出来测试下squid3.0 结果起到一半由于fstab还有挂载存储lun的信息,只能进repair filesystem,打算fstab里面删除挂载存储lun的信息又发现整个文件系统是只读挂载,晕,网上搜了搜,用#mount -o remount / 重新挂载根分区搞定了。

分类: linux相关 标签:

linux ulimit参数介绍

2009年3月12日 1 条评论

在*NIX将TCP/IP也作为文件来访问,而一般系统默认的访问文件数是1024。如果是在运营级别服务器上面就需要调整系统的最大访问文件数来提高网络并发性能。
调整方法就是ulimit命令,比如ulimit -SHn 65535

ulimit 参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes

一般可以设置 ulimit -SHn 65535
请注意,该命令只在当前shell环境下有效,而且只能由root权限来设置,一般可以放在需要启动服务的命令脚本里,另外,如果你是用root登录来启动服务的话,防止忘记这条命令,一般可以设置在~/.root 下的 .bash_profile 文件或者/etc/rc.local文件中,不建议在/etc/profile 中设置,因为该命令只有root用户有权限将数字增加到超过系统默认的上限(比如 -n 打开文件数 1024 )。

分类: linux相关 标签: ,

CENTOS 5下双网卡实现网络的高性能HP和高可用HA

2009年3月7日 没有评论

高性能HP和高可用HA网络介面设定都是一样的
cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.10.104
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

区别设定文件/etc/modprobe.conf中的mode的值
mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。需根据交换机可提供的工作模式选择。
mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。
mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份。
1.实现网络高性能HP则在/etc/modprobe.conf加入以下二行
alias bond0 bonding
options bond0 miimon=100 mode=0
2.实现网络高可用HA则在/etc/modprobe.conf加入以下二行
alias bond0 bonding
options bond0 miimon=100 mode=1

设好配置文件后,执行如下二条指令即可,无需重启系统
ldconfig
/etc/init.d/network restart

查看 ifconfig -a
bond0 Link encap:Ethernet HWaddr 00:E0:4C:B1:0F:5A
inet addr:192.168.10.104 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:4805 errors:0 dropped:0 overruns:0 frame:0
TX packets:2030 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:414775 (405.0 KiB) TX bytes:420723 (410.8 KiB)

eth0 Link encap:Ethernet HWaddr 00:E0:4C:B1:0F:5A
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:2105 errors:0 dropped:0 overruns:0 frame:0
TX packets:1194 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:182497 (178.2 KiB) TX bytes:240559 (234.9 KiB)
Interrupt:5 Base address:0×8000

eth1 Link encap:Ethernet HWaddr 00:E0:4C:B1:0F:5A
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:2706 errors:0 dropped:0 overruns:0 frame:0
TX packets:848 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:232638 (227.1 KiB) TX bytes:182028 (177.7 KiB)
Interrupt:9 Base address:0×6000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1078 errors:0 dropped:0 overruns:0 frame:0
TX packets:1078 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1487408 (1.4 MiB) TX bytes:1487408 (1.4 MiB)

分类: linux相关 标签: ,

linux下面启动network,startup eth0假死[没解决]

2009年3月5日 没有评论

昨天帮忙去给看了一台无法启动的linux主机,电话里说是启动网卡的时候显示eth0 什么错误之类的。
到哪里一看,是台联想万全的服务器,发现是启动到startup eth0提示ifcfg-eth0第x行:wq语法错误,然后就不动了,只能重启用逐个启动跳过了network进系统一看原来在ifcfg-eth0编辑退出的时候把:wq给写在里面了,汗。。。一直没重启所以没出问题。
改完重启,仍然发现在启动到startup eth0卡死,然后继续跳过network进系统手工启动发现eth0启动后显示出一堆类似网卡工作参数的内容后就没反应了。这时候切换到tty2测试网络没问题。说明网络已经工作正常了,只是启动的脚本假死。ps了一下发现最后有个awk的进程,感觉应该和网卡启动脚本有关,于是kill几次后tty1里面启动脚本显示ok了。在restart一下没问题,但是在尝试重启的时候还是这样,后来时间也晚了,也没地方查资料,感觉好像是awk的问题,所以把network改成了手动启动,放到了rc.local最后面,这样启动卡死至少所有服务和网络都正常了,能够远程ssh连上去操作和重启。

这问题蛮奇怪的,因为说之前是正常的,我看看网卡似乎也是用的内核自带的驱动,莫非问题出在awk上面?

分类: linux相关 标签: , ,

虚拟机部署ifup提示RTNETLINK answers: File exists

2008年12月26日 没有评论

vmware vi3 部署centos虚拟机模板启动、ifup eth0的时候提示
RTNETLINK answers: File exists

经过检查原来是ifcfg-eth0中已经写了网关,但是用自定义规则部署虚拟机模板的自动又生成了一个route-eth0来指定网关,删除route-eth0后问题解决

分类: linux相关 标签: , , ,

linux常用命令桌面

2008年12月21日 1 条评论

把常用的命令都放在桌面上了,还怕记不住么

cli

分类: linux相关 标签:

ubuntu 8.10=死机不断的linux

2008年11月10日 没有评论

以前一直用的opensuse,也蛮喜欢opensuse,绝对不会出现什么装完了还要装一堆字体调这个调那个才能看的顺眼,所以很喜欢opensuse的严谨,不为别的就为他中文化的效果。

由于新本子是最新酷睿2 的平台iwl5100的无线网卡要2.6.26以上的内核才原生支持,opensuse 11.0内核是2.6.25而11.1出来还有段时间,所以等ubuntu 8.10出来了之后就选择先用段时间ubuntu了,没想到装了到今天,竟然每天都有死机情况发生。omg,这还叫linux吗,赶工也赶的太粗糙了,联想到之前出过的硬盘门、网卡门事件,还being呢别把人家吓跑就不错了。

打算等fedora 10出来了后用段时间如果满意就继续用,不满意等一个月后opensuse11.1出来继续用我的opensuse。

ubuntu你除了一堆80%都用不到的软件库之外还有什么可以吸引国人的呢。

分类: 只谈心情 标签: ,

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相关 标签: , ,

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相关 标签: ,

如何在linux上安装intel wifi link 5100的无线网卡驱动

2008年9月4日 2 条评论

新本本就是麻烦,什么都是新的,驱动都难找。逛了一个晚上外国论坛总算发现个方法,明天试试

  1. Download compat-wireless from http://linuxwireless.org/download/co…ss-2.6.tar.bz2
  2. Untar somewhere (I’m choosing /usr/src/) and I’m doing everything as root from here on:
    Code:
    sudo su
    cd /usr/src
    tar xjf compat-wireless-2.6.tar.bz2
    cd compat-wireless-2008-08-06
  3. Note, as of this writing (8/24/0, the most recent compat wireless package available was dated 8/6/08, but it does contain support for the 5100 card.
  4. Edit the config.mk file and add the following lines at the end to turn on support for the 5100 card and also for the rfkill switch:
    Code:
    CONFIG_IWL5000=y
    CONFIG_IWLWIFI_RFKILL=y
  5. Download the firmware iwlwifi-5000-ucode-5.4.A.11.tar.gz
  6. Code:
    tar xzf iwlwifi-5000-ucode-5.4.A.11.tar.gz
    sudo cp iwlwifi-5000-1.ucode /lib/firmware/2.6.24-19-generic/
  7. Code:
    make
    make install
    make load

    This will add support for the 5100 card to the iwl4965 kernel module. This is probably temporary and from what I read the 2.6.26 kernels already have an iwl5000 module…

  8. Code:
    lshw -C network
      *-network DISABLED
           description: Wireless interface
           product: Intel Corporation
           vendor: Intel Corporation
           physical id: 0
           bus info: pci@0000:0e:00.0
           logical name: wmaster0
           version: 00
           serial: 00:16:ea:73:64:e0
           width: 64 bits
           clock: 33MHz
           capabilities: pm msi pciexpress bus_master cap_list logical ethernet physical wireless
           configuration: broadcast=yes driver=iwl4965 latency=0 module=iwl4965 multicast=yes wireless=IEEE 802.11abgn
      *-network
           description: Ethernet interface
           product: RTL8111/8168B PCI Express Gigabit Ethernet controller
           vendor: Realtek Semiconductor Co., Ltd.
           physical id: 0
           bus info: pci@0000:14:00.0
           logical name: eth0
           version: 02
           serial: 00:1e:ec:55:88:02
           size: 100MB/s
           capacity: 1GB/s
           width: 64 bits
           clock: 33MHz
           capabilities: pm msi pciexpress msix vpd bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
           configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=2.2LK duplex=full ip=192.168.1.8 latency=0 link=yes module=r8169 multicast=yes port=twisted pair speed=100MB/s
  9. And this is where I get stuck. The wlan0 device is not enabled. I think this is related somehow to the hardware RF Kill switch (airplane switch) that disables wireless. This machine has a hardware switch and a software Fn+F2 option. Neither combination has worked for me. Toggling the hardware switch generates errors in the syslog:
    Code:
    Aug 24 16:29:38 wta-mobile kernel: [ 1576.686265] atkbd.c: Unknown key pressed (translated set 2, code 0xf1 on isa0060/serio0).
    Aug 24 16:29:38 wta-mobile kernel: [ 1576.686275] atkbd.c: Use 'setkeycodes e071 <keycode>' to make it known.
  10. This thread talks about the rfkill switch, but none of the suggestions have worked for me.
分类: linux相关 标签: