显示标签为“linux”的博文。显示所有博文
显示标签为“linux”的博文。显示所有博文

2009年5月7日星期四

Ubuntu 9.04 ext4文件系统下启用quota的方法

904开始支持ext4了,但是我装好以后发现quota找不到我的挂载点了,而我确定所有的设置没问题。于是开始怀疑是ext4的问题,Google一下发现很久以前这个bug就出了,但是到现在还没fix,找到一个邮件说要给quota打个patch,因为旧版的quota支持的是ext4dev,也就是开发板的ext4.
那么在官方没有升级之前,我就先山寨一个用咯:
要打的补丁是

Index: quota-tools/mntopt.h
===================================================================
--- quota-tools.orig/mntopt.h 2007-08-22 04:26:55.000000000 -0700
+++ quota-tools/mntopt.h 2008-10-29 16:37:57.000000000 -0700
@@ -6,7 +6,8 @@
/* filesystem type */
#define MNTTYPE_EXT2 "ext2" /* 2nd Extended file system */
#define MNTTYPE_EXT3 "ext3" /* ext2 + journaling */
-#define MNTTYPE_EXT4 "ext4dev" /* ext4 filesystem */
+#define MNTTYPE_EXT4 "ext4" /* ext4 filesystem */
+#define MNTTYPE_EXT4DEV "ext4dev"/* ext4dev filesystem */
#define MNTTYPE_MINIX "minix" /* MINIX file system */
#define MNTTYPE_UFS "ufs" /* UNIX file system */
#define MNTTYPE_UDF "udf" /* OSTA UDF file system */
Index: quota-tools/quotacheck.c
===================================================================
--- quota-tools.orig/quotacheck.c 2008-10-29 16:38:50.000000000 -0700
+++ quota-tools/quotacheck.c 2008-10-29 16:39:09.000000000 -0700
@@ -1064,6 +1064,7 @@ static void check_all(void)
!hasmntopt(mnt, MNTOPT_GRPJQUOTA) && !warned &&
(!strcmp(mnt->mnt_type, MNTTYPE_EXT3) ||
!strcmp(mnt->mnt_type, MNTTYPE_EXT4) ||
+ !strcmp(mnt->mnt_type, MNTTYPE_EXT4DEV) ||
!strcmp(mnt->mnt_type, MNTTYPE_REISER))) {
struct utsname stats;

Index: quota-tools/quotasys.c
===================================================================
--- quota-tools.orig/quotasys.c 2008-10-29 16:39:45.000000000 -0700
+++ quota-tools/quotasys.c 2008-10-29 16:40:01.000000000 -0700
@@ -63,6 +63,7 @@ static int correct_fstype(char *type)
if (!strcmp(type, MNTTYPE_EXT2) ||
!strcmp(type, MNTTYPE_EXT3) ||
!strcmp(type, MNTTYPE_EXT4) ||
+ !strcmp(type, MNTTYPE_EXT4DEV) ||
!strcmp(type, MNTTYPE_JFS) ||
!strcmp(type, MNTTYPE_MINIX) ||
!strcmp(type, MNTTYPE_UFS) ||


--

他给的patch的目录可能和你的不一样,每行前面有-的是要删除的,有+的是要添加的。然后去吧源代码拉下来先。

apt-get source quota

获取源代码以后按照上面给出的patch改源代码,其实就3处改动,手工改也可以。configure了以后不用make,直接用dpkg-buildpackage吧他打成deb包,这时可能提示缺少若干-dev包,装上就行了,之后用dpkg -i装上去就可以了,装之前推荐用apt-get remove quota吧原来的卸载掉。

继续折腾:通过Web方式修改Linux用户密码的PHP脚本

搞了一晚上,现在有点头晕,可能写的不是很清楚,有些遗漏,有问题请留言,谢谢。

昨天协会到了一台服务器,在我的强烈要求下跑了Linux,然后有人提出来可不可以在上面跑个Apache+PHP给小朋友们做主页玩,我觉得这个想法不错于是开搞。最开始是计划用proftpd进行文件上传的,但是配置了半天,发现使用mysql后端的proftpd性能不是一般的差- -||,进行个ls都要等5秒以上,Google无果,以前也没有接触过这玩意儿,所以决定换回相对熟悉的vsftpd,外加apache的userdir模块,然后使用系统帐号进行控制(我知道vsftpd也能用mysql做后端,但是一样没用过)。
但是只用系统帐号就存在一个密码更改的问题,总不能人家每次想改个密码都要告诉我手工改吧(不想给他们开ssh权限)。于是,下面这个玩意儿出现了。
首先是代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">
<head>
<title>修改登录密码</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php
$u = $_POST['u'];
$o = $_POST['o'];
$p = $_POST['p'];
$r = $_POST['r'];
$error = 'no error';
if ($u){
echo '<pre>';
if($p!=$r){
echo 'ERROR: Password not match, please check your input.';
//}else if($u!=$_SERVER['PHP_AUTH_USER']){
// echo 'ERROR: Unable to change other\'s password.';
}else if(!$p){
echo 'ERROR: New Password is empty!';
}else if(strpbrk($p,"\r\n")||strpbrk($u,"\r\n")){
echo 'ERROR: Account name and password should not contain \r or \n!';
}else{
echo "Tying to change password for {$u}...\n";
if(!pam_auth($u,$o,$error)){
echo "ERROR: $error\n";
}else{
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a file to write to
);

$cwd = NULL;
$env = NULL;

$process = proc_open('sudo /usr/sbin/chpasswd', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
fprintf($pipes[0],"%s:%s\n",$u,$p);
fclose($pipes[0]);

echo stream_get_contents($pipes[1]),"\n";
fclose($pipes[1]);

echo stream_get_contents($pipes[2]),"\n";
fclose($pipes[2]);

$return_value = proc_close($process);

echo "Command returned $return_value";
}
}
}
echo '</pre>';
}else{
$u=$_SERVER['PHP_AUTH_USER'];
}
?>
<form method=POST><table>
<tr><td colspan=2 align='center'>修改用户口令</td></tr>
<tr><td>用户名: </td><td><input type=text name='u' value='<? echo $u; ?>'/></td></tr>
<tr><td>原密码: </td><td><input type=password name='o'/></td></tr>
<tr><td>新密码: </td><td><input type=password name='p'/></td></tr>
<tr><td>重复密码:</td><td><input type=password name='r'/></td></tr>
<tr><td colspan=2 align='center'><input type=submit value='确认'>  <input type=reset value='取消'></td></tr>
</table></form>
</body>
</html>

然后讲一下如何配置:
首先,这里用到了一个php扩展:pam,我的服务器是ubuntu的,装这个东西时也废了不少功夫,首先apt-get install php-pear 然后还要装几个dev库(php5-dev libpam-dev)然后就可以用pear pam下载编译这个叫pam的扩展了。
装好这个还要设置:新建/etc/pam.d/php,内容从login文件里面复制就可以了,或者你可以试试他说明文档中提到的那个:

# /etc/pam.d/php
#
# note: both an auth and account entry are required

auth sufficient /lib/security/pam_pwdb.so shadow nodelay
account sufficient /lib/security/pam_pwdb.so

这个我试过,好像不能用,不知道是不是版本的问题。
然后麻烦的事情来了,要设置其他用户的密码,必然需要root权限,假如我们给予了apache的用户某些特权,必然会对整个系统的安全造成影响,尤其是我现在还允许用户上传自己的PHP,而PHP的disable_functions只能全局设置,所以我觉得从根本上吧用户和特权基本分类:使用多个Apache实例,每个实例使用不同的php配置。
设置参考这个帖子:http://blog.datajelly.com/company/blog/46-multiple-apache-instances-in-ubuntu.html
我是这样设置的:新的apache只监听SSL的443端口,使用web_admin这个低权账户登录系统(而用户使用的旧apache使用www-data),最小化配置(关闭所有无用的modules),关闭php的安全设置。在独立Php配置时使用了PhpIniDir这个httpd.conf的参数,用过win32下的apache+php的应该熟悉。

使用visudo修改/etc/sudoer这个文件,在文件的最后添加:
web_admin ALL=NOPASSWD: /usr/sbin/chpasswd

注意这里一定要用visudo这个东西修改,不要直接打开!
这样就赋予了web_admin这个用户使用root权限运行/usr/sbin/chpasswd的权限了,比直接设置sid之类的方法要安全一些

这样一来,整个系统就大概可以投入使用了。

2009年4月30日星期四

简要测试了一下Ubuntu9.04

前几天吧学校的APT服务器更新到904了,顺便还下了904的DVD镜像(其实主要是手头没有CD盘了,用DVD盘刻CD多浪费啊),今天吧盘子刻出来简要的使了一下,发现确实有不少改进,虽然说缺点还是有不少。
上次用桌面的Linux还是一年前了(虽然一直在用Linux的服务器),当时好像是用804的LiveCD的,结果本本的声卡网卡显卡一律不认,这次很好,虽然显卡驱动是私有包,但是不装驱动的话分辨率还是能到正常的,而上次只能勉强使用1024x768。由于是LiveCD,所以没去装私有驱动(要重启)。声卡方面,有改进,但是还是有问题:不认识耳机插孔,耳机拔掉很正常,但是插上就没有声音了。Google了一下,好像是因为驱动识别的问题,要解决还是要动内核然后重启,所以继续不管- -
DVD版本的LiveCD确实比CD要好用,至少象输入法之类的包都有了(好像输入法的话把所有语言都包括了……)不过SCIM好像还是有问题。比如一启动竟然给我出现了两个SCIM的图标,然后切换输入法还经常让某个进程崩溃。
听网上有人说904启动速度挺快……不过这个LiveCD我用了5分钟才从黑屏状态转出来,难道是我光驱的问题么?不过运行起来倒是不慢,另外,在我自己的服务器上进行apt-get就是爽啊,装什么包几乎都是秒杀的=w=.
大概初体验就是这样了,没有仔细研究。而且由于是LiveCD,很多特性还是体验不了的,等有时间&有硬盘的时候再安装&try吧(估计到那时候,910都该有了)。

2009年2月28日星期六

建立Ubuntu APT镜像服务器

由于学校的网络环境特殊,造成部分Linux用户无法正常上网更新,于是在学校内搭建了一个Apt的镜像服务器,现在吧搭建过程交代一下:
首先先装好了一个ubuntu server系统,装了个lighttpd服务器(个人喜好而已,其实真正使用时应该用apache)

#apt-get install lighttpd

然后是apt-mirror

#apt-get install apt-mirror

配置apt-mirror:

#pico /etc/apt/mirror.list

文件内容:

############# config ##################
#
# set base_path /var/spool/apt-mirror
#
# if you change the base path you must create the directories below with write privileges
#
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch
set nthreads 40
set _tilde 0
#
############# end config ##############

deb http://mirrors.163.com/ubuntu/ intrepid main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ intrepid-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ intrepid-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ intrepid-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ intrepid-backports main restricted universe multiverse

clean http://mirrors.163.com/ubuntu/

其实就是source.list的内容,加上一头一尾。
因为需求比较少,我就没加deb-src,可以节省不少空间。另外,默认是20线程的,我改成了40线程。
修改好了以后就可以建立镜像了:

#apt-mirror

根据你的网速,这个下载过程会很久(因为要下载的东西很多,我的配置文件需要下载26G左右的数据)。我等了6个小时左右完成了这个操作。
下载的文件保存在/var/spool/apt-mirror/ 下一步就是在lighttpd的web文件夹建立一个link过去就可以了

#ln -s /var/spool/apt-mirror/mirror/mirrors.163.com /var/www/ubuntu

这样,一个apt镜像就可以访问了,客户端只需要修改它的/etc/apt/source.list就可以了,替换一下服务器地址就行。

另外,还要建立一个定期任务,让apt-mirror自动更新:
修改/etc/cron.d/apt-mirror:

0 4 * * * apt-mirror /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log


另外,/var/spool/apt-mirror/var/clean.sh可以清理掉一些没用的文件,每隔一段时间运行一下就行。

2008年6月23日星期一

[转]控制台下的输出色彩控制

VT100控制符文档
这个东西很好玩,你可以用这些东西来展现多彩世界。
我在PHP、C/CPP、SHELL等输出文本中都写这些东西。。。

格式:
echo "\033[字背景颜色;字体颜色m字符串\033[0m"

例如:
C程序语句:

printf(" \033[41;36m something here \033[0m");

PHP:

echo "Rpc Time:\033[40;33m",$string,"\033[0m\n";

and so on...
其中41的位置代表底色, 36的位置是代表字的颜色

那些ascii code 是对颜色调用的始末.
\033[ ; m …… \033[0m

字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

==============================ANSI控制码的说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标