分类: '经验技巧' 的归档
充分利用磁盘空间,打开ext文件系统的保留区块
今天,吼吼来找我说,他的硬盘,有个分区一共有234G,但是只用了222G,就报满了,无法继续使用了。
其实这个问题,我不久前刚看过一下,只要你仔细看 mkfs.ext3 的man page,就可以知道原因了,其中有这么一句:
|
1 2 3 4 5 6 |
-m reserved-blocks-percentage Specify the percentage of the filesystem blocks reserved for the super-user. This avoids fragmentation, and allows root-owned daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem. The default percentage is 5%. |
也就是说,ext文件系统,包括ext2、ext3、ext4都会默认预留5%的磁盘空间,留给root用户维护系统或者记录系统关键日志的时候使用,这也就是导致普通用户无法使用部分磁盘空间的原因了。
我个人觉得,这个选项用在根分区或者/var之类的分区,还是有一定的必要性的。但是如果是/home、/opt或者干脆是/data之类的数据分区,就显得有点多此一举了。而且,现在的磁盘空间越来越大,5%往往会有10多G,都可以存一部高清了。这么多空间浪费了,是不是太可惜了呢?
于是,就去找相关资料,看能可否在不格式化的情况下改变保留区块的大小。
吼吼找到了这个,比我想像得还要简单,甚至都不需要umount分区,就可以进行修改。
具体操作过程如下,已经加了详细注释:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#之前的保留区有 732463 块 lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count" Reserved block count: 732463 #已用空间+可用空间 和 总空间 相比,还少了近3个G lily@LLY:~$ df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda7 57677500 47662588 7085060 88% /home #调整: lily@LLY:~$ sudo tune2fs -r 25600 /dev/sda7 tune2fs 1.41.9 (22-Aug-2009) Setting reserved blocks count to 25600 #再来看看空间,哈哈 lily@LLY:~$ df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda7 57677500 47662584 9912516 83% /home #确认调整成功 lily@LLY:~$ sudo tune2fs -l /dev/sda7 | grep "Reserved block count" Reserved block count: 25600 |
看到了吧?就一眨眼的功夫,我就多了3G多的空间,哈哈。而且我还不是直接完全去掉保留区块呢,也留了百多兆以防不时之需呢,呵呵。
算了一下,吼吼那个3.4T的磁盘阵列,省出来的空间居然比我的整个硬盘都大。嗨。。。
nginx 对某些 User_Agent 进行限速的方法
本文为nginx 禁止某个 User_Agent 的方法的姊妹篇,不知所云的话,建议先看看这文。
由于之前已经将某个特别疯狂的迅雷的User_Agent给封掉了,所以最近一段时间,我的那源服务器也运行地比较稳定,但是今天,Linux Deepin 9.12正式发布了,由于我给Deepin做了一个iso的镜像,所以服务器又经历了一个访问高峰,如下图:

从这里也可以看出Linux Deepin的受欢迎程度,哈哈。
可以看到从11:00以后,100M的带宽就已经被完全撑满了。。。一看日志,大部分又是迅雷干的,但这次迅雷不是用某个特定的UA来访问了,而是各有变化,但是却都包含MSIE,哈哈。
当然IE用户直接访问的话,也会有这个MSIE,但是没办法,为了保全Ubuntu APT-HTTP的合法权益,只能限制一下MSIE了。
但是怎么限制呢?总不能人家用MSIE的连主页面都打不开吧?哈哈,最好的办法就是限速,于是,有了这个配置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
server { listen 80; server_name ubuntu.srt.cn; access_log /var/log/nginx/mirror.access.log; location / { root /data/mirrors; autoindex on; index index.html index.htm; if ($http_user_agent ~ "MSIE") { limit_rate 2k; } if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.0;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") { return 404; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } } |
让我们邪恶的看一下效果,哈哈:
wget的默认UA的时候:
|
1 2 3 4 5 6 7 8 9 10 11 |
$ wget --no-cache http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null --14:08:28-- http://u.srt.cn/ubuntu/ls-lR.gz => `/dev/null' 正在解析主机 u.srt.cn... 211.155.227.167 Connecting to u.srt.cn|211.155.227.167|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:8,051,367 (7.7M) [text/plain] 100%[====================================>] 8,051,367 6.34M/s 14:08:29 (6.33 MB/s) - `/dev/null' saved [8051367/8051367] |
UA里含有MSIE的时候:
|
1 2 3 4 5 6 7 8 9 |
$ wget --no-cache --user-agent="Something with MSIE; bla bla" http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null --14:07:59-- http://u.srt.cn/ubuntu/ls-lR.gz => `/dev/null' 正在解析主机 u.srt.cn... 211.155.227.167 Connecting to u.srt.cn|211.155.227.167|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:8,051,367 (7.7M) [text/plain] 0% [ ] 49,152 2.08K/s ETA 1:02:38 |
某个该死的特定UA:
|
1 2 3 4 5 6 7 |
$ wget --no-cache --user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" http://u.srt.cn/ubuntu/ls-lR.gz -O /dev/null --14:09:22-- http://u.srt.cn/ubuntu/ls-lR.gz => `/dev/null' 正在解析主机 u.srt.cn... 211.155.227.167 Connecting to u.srt.cn|211.155.227.167|:80... 已连接。 已发出 HTTP 请求,正在等待回应... 404 Not Found 14:09:22 错误 404:Not Found。 |
从上图也可以看到,做了这个设置以后,从14:00左右开始,服务器的流量虽然还是比较大,但是已经趋于正常了。
所以,偶尔要从我源里下东西的同学,可以用firefox直接下载,也可以用axel或者wget之类的工具下,但是千万别用IE相关的工具,不然,后果自负,哈哈~
简单的WP备份脚本
现在,写blog的人是越来越多了;这部分人里,自己建站的也越来越多了;又在这部分人里,用WP来建的也越来越多了。
而建过站的人,都知道备份的重要性。但是手工备份又显然太麻烦了,所以我写了这个脚本来自动备份,放cron里以后,基本上就不用去关心什么了,哈哈,不过在加crontab的时候,要注意用户,如果是用root跑,可能会因为读不到当前用户的key而备份失败哦。
条件是你的空间支持ssh登录,并且事先做好了rsa公钥,登录的时候不需要输入密码。
此脚本会生成两个文件,一个是文件的打包,一个是数据库的打包。上脚本吧:
|
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 |
#!/bin/sh #WP备份脚本 #方便地备份wordpress的文件及数据库(限mysql) #作者: bones7456 #需要事先设置好这个HOST的rsa key 不然无法用ssh登录 HOST="gnometwe@li2z.cn" #远程的WP文件所在目录,此目录下要有 wp-config.php REMOTE_PATH="www/li2z" #本地保存目录(最好是绝对路径),留空为当前目录 LOCAL_PATH="/home/lily/li2z.backup" #备份文件的前缀,默认自动按时间生成 PRE=`date +%F-%H-%M-%S` [ -z $LOCAL_PATH ] || cd $LOCAL_PATH #先备份文件 ssh $HOST "cd $REMOTE_PATH; tar cf - -X exclude ." | gzip > $PRE.tar.gz #从文件取得数据库信息 tar zxvf $PRE.tar.gz ./wp-config.php if [ -f wp-config.php ];then DB_NAME=`grep "^define('DB_NAME'" wp-config.php | cut -d\' -f 4` DB_USER=`grep "^define('DB_USER'" wp-config.php | cut -d\' -f 4` DB_PASSWORD=`grep "^define('DB_PASSWORD'" wp-config.php | cut -d\' -f 4` rm wp-config.php else echo "Something wrong ..." exit 1 fi #再备份数据库 ssh $HOST mysqldump -u${DB_USER} -p${DB_PASSWORD} $DB_NAME | gzip > $PRE.sql.gz #这个可选,删除15天前的备份文件 #要打开的话,记得建个专门的目录存放备份,以免误删其他文件 #find . -maxdepth 1 -name "*.gz" -mtime +15 -exec rm {} \; |
PS: 稍作修改应该也可以用于非WP的blog系统。
在ubuntu下架设rsync和ftp服务
还是因为我的那个ubuntu源,之前只能以http方式访问,看到很多源也同时提供ftp和rsync的访问方式,我也就学着架设了一个。
先说说ftp方式,这个比较简单,参照官方源,我用的也是vsftpd。这个在ubuntu下几乎是不用配置就可以跑了。大致就是:
|
1 2 3 |
sudo apt-get install vsftpd #安装vsftpd,会自动建立ftp用户,家目录默认是 /home/ftp sudo usermod -d /data/mirrors ftp #将ftp的家目录改成你数据所在的目录,人家访问的时候就可以读到这个目录的内容了 sudo /etc/init.d/vsftpd restart #重启安装的时候就默认启动的vsftpd |
这样就完全可以了,如果你还想修改一下人家登录的时候的欢迎信息的话,编辑 /etc/vsftpd.conf ,将里面的 ftpd_banner= 解除注释,并将你要的信息填在后面。
其实这个配置文件还有很多其他选项可以修改,诸如是否允许匿名登录、写权限之类的,需要的话,自己 man vsftpd.conf 好了。
再说说rsync的服务端配置,我发现网上的那些中文教程用在ubuntu下都是会有问题的。
在ubuntu下,这个rsync的服务端和客户端似乎是一个东西,也就是没有rsyncd这个包了,所以也就不需要安装额外的包了,只需简单配置一下,并启动就可以了。
参照 man rsyncd.conf 的提示
建立一个 /etc/rsyncd.conf 文件,内容如下:
|
1 2 3 4 5 6 7 |
motd file = /etc/rsyncd.motd pid file = /var/run/rsyncd.pid [ubuntu] comment = Hangzhou srt ubuntu mirror path = /data/mirrors/ubuntu max connections = 3 log file = /var/log/rsyncd.log |
其中 motd file 应该是可选的,如果写上了,就需要再建立一个 /etc/rsyncd.motd 的文本,写入欢迎信息,有空的话,还可以搞个帅帅的ASCII art哦。
上面的两行是全局的配置,下面中括号里的是模块名,以下的配置都是模块级的。可以同时指定多个模块。
配置好了以后,执行
|
1 |
sudo /etc/init.d/rsync start |
rsync应该就启动了,另外可以在 sysv-rc-conf 里确保启动的时候就开启了rsync服务。
现在也可以通过以下方式访问SRT ubuntu mirror了:
rsync://ubuntu.srt.cn/ubuntu
ftp://ubuntu.srt.cn/ubuntu/
linux真的很安全么?
写这篇文章是因为看到了cnbeta上最近接二连三地出现类似这篇的文章。
虽然我还是认为此文的作者多少还是有点标题党,因为那个 ./a 其实可以是任何东西,这样就说是“一个命令”也太无聊了点。但是我在公司的RHEL4的服务器上试验了之后,确实可以非法提升权限。不免有点担忧。
于是我顺藤摸瓜,在那个提供hack代码的网站上不费吹灰之力,就找到了一、二、三3个能非法提升root权限的程序,而且这几个程序是一周内公布的,所以相信真要找的话,还能找到很多,何况还有人家未公布的呢?
不过大家也不用太担心,这些程序都有个共同点,见到的最厉害也只能危及2.6.27的内核,而现在的内核都是 2.6.30/31 的时代了。
但是,我公司的2.6.9-55.ELsmp内核的EHRL4服务器就遭殃了,3个程序都中招了,这就说明了保持更新的重要性。一般这种服务器更新都会比较谨慎,有时候甚至无人去管理更新的事情,而且大多都是开着ssh的,这样的linux其实一点都不安全,我就见过一台服务器,老出这样那样的怪问题,最后我去看的时候,大部分/bin和/usr/bin下的常用可执行文件都已经被修改过了,文件的时间也都是一样的,而且正是这个时间开始才反常的。究其原因,正是因为这台公网IP的机器开着SSH,而且root密码还是无敌的“123456”。。。这样,即使那机器本身没有什么重要的文件,一旦被攻陷,损失和麻烦还是不少的,更何况局域网的其他机器也会受到牵连。
在这里,有必要给大家几点建议,做到以下几点linux才能真正安全一些
- 提高安全意识,不要认为装了linux就可以高枕无忧了,安不安全其实还得靠人。我觉得这点正是最重要的。
- 如果非得开ssh,一定要装上denyhosts(不知道为什么这个也要墙掉,无语了),denyhosts可以帮你有效地避免被ssh暴力破解。
- 最好像ubuntu默认的一样,禁用root账号,不然的话,至少禁止root直接ssh登录,因为人家在不知道你用户名的情况下,一般的都是用root来暴力破解的
- 不要使用弱密码,这点似乎总有人会犯错。。。
- 始终保持更新,可以避免上面说到的情况。
- 谨慎执行来历不明的二进制文件,尤其是需要sudo的。开源的才是最安全的。
- 不要贪图方便,时不时大面积地 chmod -R +x xxxx ,尤其不能 chmod -R 777 xxxx
先这么多了,有其他再补充。。。
gentoo也可以提示未安装的命令
用ubuntu的时候,如果你在命令行里输入一个未安装的命令,bash会给出很人性化的提示,让你先安装xxx软件包,比如:
|
1 2 |
程序 'xxx' 尚未安装。 您可以通过输入以下命令安装: sudo apt-get install xxx |
其实gentoo下也是可以做类似提示的.
gentoo早就已经默认是 bash 4.x 了,这个版本的bash,在找不到命令的时候,会试着调用 command_not_found_handle 这个函数,也就是说,只要你在什么地方定义了这个函数,就可以实现人性化的提示.再联想到之前我整的e-file,一切都是这么简单,哈哈~
在 ~/.bashrc 里加上如下几行:
|
1 2 3 4 5 6 7 8 9 |
if echo "`uname -a`" | grep gentoo >/dev/null ; then #由于我的.bashrc是ubuntu和gentoo共用的,所以这里还有些gentoo特有的alias...下面几行才是关键. command_not_found_handle () { echo "-bash: $1: command not found" >&2 e-file $1 >&2 } else #ubuntu的alias.... fi |
当然,这之前肯定要先安装e-file,如果你已经加了gentoo-china的overlay,可以直接 emerge e-file
最终效果贴个图(我是gnome,没装kdevelop):

关于分区和引导也许你不知道的杂七杂八
1.用gparted把一个110G的ext3分区,缩小到78G(实际使用的空间只有20G左右),需要用2个多小时.可能和已使用的空间无关?空白区域也复制了一遍?
2.用gparted把ext3分区缩小以后,其uuid是不会变的.
3.备份主引导扇区的方法:
|
1 |
dd if=/dev/sda of=mbr_512_ubuntu bs=512 count=1 |
注意:这512字节的东西里,不仅备份了MBR(前446字节)也备份了分区表,所以如果你备份完了以后,又改变过分区,再用老的512字节来恢复的话,后果可能比较严重.
4.所以,恢复MBR(比如重装过windows的时候要用到)的方法是:
|
1 |
dd if=mbr_512_ubuntu of=/dev/sda bs=446 count=1 |
这里的ba=应该是446字节,而不应该是512字节,除非你确认和备份的时候的分区完全一致.
5.但是用如上命令恢复完了以后,分区激活标志(也就是gparted里面看到的boot标志),是不会变的(因为这属于分区信息,是位于446~512字节的),所以也许grub菜单还出不来,需要用gparted重设一下标志位.如果第4步中的bs=改成512应该不会有此麻烦,当然如果你理解了上面的文字,就会明白我还是推荐用446的.
6.grub2的配置文件是 /boot/grub/grub.cfg (相当于grub时代的menu.lst),这个文件是 /usr/sbin/update-grub 根据 /etc/grub.d 里面的脚本自动生成的,所以不推荐直接修改 /boot/grub/grub.cfg ,而是修改 /etc/grub.d 里的相应文件,要禁用某个文件,只需要 chmod -x nn-xxx 就可以了.改完后执行 update-grub 即可看到grub.cfg被更新了.
以上东西是bones7456根据实际操作经验总结得出的,水平有限,并不能保证正确性和适用性,而且还有比较危险的dd命令.因此操作时请务必小心,万一丢失数据可别来找我,哇卡卡…
访问Vbox的guest系统的方法
相信很多linuxer都用过Vbox,拿来虚拟个win或者其他的系统,很方便,用着感觉也很不错,只是今天我遇到了一点点麻烦.
我想在host里访问guest的80端口,比如在guest里跑了个apache之类的.
我的host的IP是192.168.6.239,一看guest的IP是10.0.2.15,vbox里设置的连接方式是NAT,在guest里上局域网和公网都正常,但是在host里却ping不通guest的IP…也就是host和guest的通信是单向的…
后来查了下资料,才明白原因,要实现双向通信,需要在host里虚拟一个网络设备(也就是虚拟网卡),然后通过桥接的方式将host的虚拟网卡和guest的网卡相连,就像以前用的vmware的bridge模式一样,默认就给你生成几个虚拟网卡,但是vbox却不是这样做的,它需要自己添加.具体操作方法可以参见这里或这里.
步骤还是比较繁琐的,所以我用的就不是这个办法,而是另一个比较快捷的办法,当然快方法也有坏处,就是只能访问guest的一个端口,刚好,我只需要它的80端口.
步骤:用文本编辑器打开 ~/.VirtualBox/Machines/机器名/机器名.xml
然后在ExtraData那节下面添加以下三行:
|
1 2 3 |
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestweb/Protocol" value="TCP"/> <ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestweb/GuestPort" value="80"/> <ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestweb/HostPort" value="50000"/> |
这3行,相当于吧guest的某个端口映射到了host的端口. 其中 guestweb 可以替换成想要的名字.第二行的value数字,就是guest的端口号,第三行的value数字就是host的端口号.
这样启动guest以后,就可以访问 http://localhost:50000 了,哈哈.
以上方法在Vbox 2.1.4 版本试验通过.
========090409 21:00 更新========
好吧,我承认我火星了一回,其实只要 modprobe vboxnetflt 以后,再在网络连接里选 host interface,就相当于vmware的桥接了.
这样guest就能得到和host一样的IP段,并且host也可以直接访问guest.
但其实这方法也是有缺陷的,比如我之前用的是host的eth0,把guest休眠了以后,到了家里,host改用wlan0了,结果guest就没有网络连接了….
哈哈,所以我那方法还是有一定的用处的.到底用哪种,就自己决定吧~
一个命令把几千张照片压缩了
数码相机拍的照片,已经积累了很多个G了,于是就都备份到光盘里保存了,但是怎么处理硬盘上的数据呢?rm之觉得可惜,毕竟光盘没有那么方便,不能随时查看,但是放着又太大太浪费硬盘空间了,现在的相机一张都有3~4M的.我能想到的最好的办法,就是把每张照片压缩以后,把小图片留在硬盘上,这样即可以快速查看,又不是很浪费硬盘空间,于是有了这个命令:
注意此命令会删除当前目录及子目录下的所有jpg文件,最好是理解以后,再执行
|
1 |
find . -name '*.jpg' | while read i;do convert -resize 30% "$i" "${i%.jpg}_.jpg";rm "$i";done |
把当前目录及子目录下的所有 xx.jpg 压缩成横竖分辨率都为原尺寸的30%的 xx_.jpg 文件.对于我的相机来说,压缩后的大约800*600的大小对于屏幕浏览来说已经足够了,而每张300K左右的尺寸也很经济.
没有convert命令的同学需要检查是否装了 imagemagick 包.
PS:真庆幸自己没在用windows了,如果是win下,估计又得上网找所谓的”绿色版图像批处理软件”了,问题是:即使找到了,能完全合我的心意吗?称心了,要找注册码吗?找到注册码了,确定不含木马病毒吗…Orz