调整Linux磁盘分区大小

在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.比如: 我在安装系统时给/usr/local分配器了5G的空间,但使用一段过程后发现, /usr/local最多只用到了1G.这样可以将/usr/local大小调整为1G. 空出4G留作他用.本文归纳了在不破快文件系统数据的前提下对文件系统大小进行调整的方法.这里采用的是”拆东墙, 补西墙”的方法. 当然, 如果你的磁盘中有未分区的空闲空间, 你就不用减小某个分区的空间了. 这实际上是一个特例.减小一个分区的大小:[ partition ][ partition | free space ]增加一个分区的大小:[ partition a1 | partition b | free space ][ partition a2 | | partition a2 ]
当然如果有第三方磁盘,那就简单了。
1 挂载新磁盘
2. 把 tar -cf opt.tar /opt ; tar -cf usr.tar /usr
3. 卸载 /usr /opt 马上 fdisk -l 重新分区及格式化
4. 重新挂载 /usr /opt
5. tar xvf opt.tar -C /opt ; tar xvf usr.tar -C /usr
重启一下测试一下就好了

准备工作

——————————————————————————–
(一) 备份

首先组好备份要更改的分区中的文件. 对磁盘的操作也许会导致数据的丢失. 开始工作之前最好将重要的数据保存到别的分区.

(二) 获取相关信息.

1, 运行 $ df , 查看文件系统信息. 记下你想要调整的分区对应的挂载点和设备文件.
这一步是为了查看/usr/local对应/dev/中的哪个设备文件. 本文以/dev/hda7为例.

2, 运行 # sudo fdisk /dev/sda . 进入fdisk , 按下p, 查看磁盘分区信息. 记下/dev/sda8的起始柱面号, 终止柱面号. 设他们分别为start, end. 并记下一个”Unit”包含多少字节.

注意, 文件系统大小和磁盘分区大小是不能等同的: 起码他们的计量单位不同. 在文件系统中, 一般用KB, MB, GB为单位. 但在fdisk中, 是以磁盘的”unit”值(即一个柱面中包含的字节数)来计算的. 我们运行 # fdisk /dev/sda后, fdisk显示如下信息:

Disk /dev/sda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

(三)计算终止柱面号

e.g: 原先/usr/local的大小为5000 MB, 起始柱面号为2550, 终止柱面号为3157. 那么我现在要将它的大小改为1000MB, 应该这样计算终止柱面号( [3.2] = 4 ):

终止柱面号 = 2550 + [(1000 * 1024 * 1024 ) / 8225280] = 2678

使用fdisk删除原来的分区(以前分区的数据不会丢失!). 然后新建一个分区, 新分区于旧分区唯一的区别就在于分区大小不一样, 这表现在他们终止柱面号不同.
增加分区大小: 终止柱面号设置为空闲空间的最后一个柱面号.
减小分区大小: 终止柱面号由计算得出.

开始调整

——————————————————————————–
在开始调整之前, 最好拿一张纸记下要调整的分区的下列信息:
调整前大小, 调整后大小. 它挂载在哪个目录, 对应于/dev/中的哪个设备. 起始, 终止柱面.

e.g: 调整前: 5G, 调整后: 1G, 挂载点: /usr/local, 对应于/dev/hda7. 起始,终止柱面分别为2550, 3157.

1, 卸载分区
最好在runlevel = 1的情况下卸载.

  1. # umount /dev/<partition to resize>

2, 检查文件系统的一致性

  1. # fsck -n /dev/<partition to resize>

3, 如够是ext3系统, 还要去除日志

  1. # tune2fs -O ^has_journal /dev/<partition to resize>

注意: 取出日志后的ext3系统是无法挂载的, 使用

  1. # tune2fs -j /dev/<resized partition>重建日志.

4, 调整文件系统大小

  1. # resize_reiserfs -s 1000M /dev/hda7

调整完文件系统的大小以后,再使用以下命令以文件系统进行全面的检查:

  1. # reiserfsck –check –fix-fixable /dev/hda7

5, 进入fdisk, 调整分区大小.

  1. # fdisk /dev/hda

由于内核仍然使用旧的分区表, 重启之后再进行后面的步骤.

通过以上步骤,我们已经完成了硬盘分区大小调整的操作,接下来回到重新调整文件系统大小的问题上来。 由于硬盘分区是按照柱面来计划的,我们要在 resize_reiserfs步骤上就一步到位调整文件系统大小与硬盘分区大小正好相等是比较困难的事情。所以一般是调硬盘分区比文件系统要大一点点, 然后再通过以下命令进行同步(当然如果你不在意硬盘分区里面存在部分空间的话也可以忽略以下步骤):

  1. # umount /home/
  2. # resize_reiserfs /dev/hda6

这样, 就将/usr/local的大小调整为1G, 留下了4G的空闲磁盘空间.
来自:http://bbs.51cto.com/thread-475486-1.html

Linux shell快速查找PHP木马

一句话查找PHP木马

  1. # find ./ -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval(gunerpress|eval(base64_decoolcode|spider_bc"> /tmp/php.txt
  2.  
  3. # grep -r –include=*.php  ‘[^a-z]eval($_POST’ . > /tmp/eval.txt
  4.  
  5. # grep -r –include=*.php  ‘file_put_contents(.*$_POST[.*]);’ . > /tmp/file_put_contents.txt
  6.  
  7. # find ./ -name "*.php" -type f -print0 | xargs -0 egrep "(phpspy|c99sh|milw0rm|eval(gzuncompress(base64_decoolcode|eval(base64_decoolcode|spider_bc|gzinflate)" | awk -F: ‘{print $1}’ | sort | uniq

查找最近一天被修改的PHP文件

  1. #   find -mtime -1 -type f -name *.php

修改网站的权限

  1. # find -type f -name *.php -exec chmod 444 {} ;
  2.  
  3. # find ./ -type d -exec chmod 555{} ;

转自:http://www.xtgly.com/2011/11/21/linux-shell%E5%BF%AB%E9%80%9F%E6%9F%A5%E6%89%BEphp%E6%9C%A8%E9%A9%AC.htm

Linux下的fdisk用法

Linux下的fdisk功能是极其强大的,用它可以划分出最复杂的分区,下面简要介绍一下它的用法:

对于IDE硬盘,每块盘有一个设备名:对应于主板的四个IDE接口,设备名依次为:/dev/hda,/dev/hdb,/dev/hdc,/dev/hdd等,如果还有IDE Raid卡,则依次为:/dev/hde,/dev/hdf,/dev/hdg,/dev/hdh。对于SCSI硬盘,则设备名依次为/dev/sda,/dev/sdb…等等

fdisk的命令行用法为: fdisk 硬盘设备名

进入fdisk后,首先键入’m’,即可显示fdisk全部菜单。

再键入’p’,显示当前分区表状态。

键入’n’,增加一个分区,然后会提示你选择分区类型(基本分区或扩展分区),再选择分区号(1-4)。注:每块硬盘最多可划分四个主分区(包括基本分区和扩展分区),其中:基本分区最多可划分四个,扩展分区最多可划分一个,但扩展分区内可再划分多个逻辑分区(最多几个我没试过,总之很多)。选中你要建立的分区类型和分区号后,会提示输入起始柱面,从1开始;然后再输入终止柱面,此时可输入实际的柱面数,也可用”+分区尺寸”的方式输入,如:+1024M表示在起始柱面后加上1024M。主分区的设备名依次为:/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4,逻辑分区的设备名依次为:/dev/hda5,/dev/hda6,/dev/hda7…等等。

键入’d‘,删除分区,输入分区号即可删除。注意,删除扩展分区时,将会同时删除所有的逻辑分区。

键入’t‘,改变分区标志(这是Linux的fdisk最精华的部份!),新建的分区默认标志是83(Linux Ext2),你可以把它改为82(Linux 交换区)、或是’b'(FAT32)、’f'(FAT32 Extend,只限于扩展分区)、’86′(NTFS)。。。等几十种类型。这样一来,使用多操作系统的朋友们就可以用Linux的fdisk划分出你想要的所有分区了!

键入’a’,切换分区激活开关。请注意:每键入一次,被选的分区就会在激活与非激活间变化一次,但你必须保证最后只有一个分区被激活。这时就用得到’p’命令了,被激活的分区上会有个’*’号。

除以上的几个命令外,还有其它几个,但不太常用。

最后,键入’w’,你对分区所做的改变被写入硬盘;键入’q’,则放弃所有的修改。

灵活应用fdisk,还可以修复一些损坏的分区表,前提是你必须准确记住原有每个分区的起始柱面和终止柱面。

再附加一下对硬盘进行格式化的方法:
要把分区格式化成Linux Ext2格式,用: mkext2fs /dev/hda?
要把分区格式化成FAT32格式,用: mkfs.vfat /dev/hda?    

linux 备份与恢复分区表

1.备份全部的分区信息

  1. #fdisk /dev/sda -l > /tmp/hda.txt

2.备份MBR

  1. #dd if=/dev/hda of=/tmp/mbr bs=512 count=1

主引导记录512字节,前446是程序代码,后64字节包含分区表信息,最后2字节标识是MBR
3.恢复分区表

  1. #dd if=/tmp/mbr of=/dev/hda bs=1 skip=446 count=66

补充:第一步可以把整个硬盘的分区信息备份下来。第二步可以把MBR上的分区表备份下来,第三步是恢复MBR上的分区信息。第一步得到的分区信息非常重要,倘若全部分区信息丢失,只恢复MBR上的分区信息也不能得到全面的分区,这时就可以通过fdisk程序按照hda.txt的内容重新建立分区表,参数要一样。这样可以恢复所有分区表信息。因为分区只修改部分扇区(Linux下叫块),并不影响正常的文件系统。此项操作具有一定风险,请不要随意进行。
分区表丢失并不代表数据丢失,重新建立分区表,只要不出差错,数据应该可以正常读取。
来源:http://861017.blog.51cto.com/235260/231847

使用CentOS网易yum源

1、首先备份/etc/yum.repos.d/CentOS-Base.repo

  1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、根据CentOS版本选择操作
CentOS-5

  1. wget http://mirrors.163.com/.help/CentOS5-Base-163.repo -O /etc/yum.repos.d/CentOS-Base.repo
  2. yum makecache

CentOS-6

  1. wget http://mirrors.163.com/.help/CentOS6-Base-163.repo  -O /etc/yum.repos.d/CentOS-Base.repo
  2. yum makecache

正确设置 php-fpm子进程用户 提高网站安全性 防止被挂木马

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。

根据生产环境不断反馈,发现不断有 php网站被挂木马,绝大部分原因是因为权限设置不合理造成。因为服务器软件,或是 php 程序中存在漏洞都是难免的,在这种情况下,如果能正确设置 Linux 网站目录权限, php 进程权限,那么网站的安全性实际上是可以得到保障的。

那么,造成网站被挂木马的原因是什么?

1.  ftp 连接信息被破解,对这个原因,可行的办法就是使用非常复杂的FTP 用户名(不要使用常用的用户名),如果是固定作业,可考虑使用 iptables 防火墙限制来源 IP 。但是一些情景下,可能需要使用 VPN 以便远程维护。 即网站维护者需要使用 FTP 修改网站文件时,必须先登录到 IDC 机房的 VPN 服务器上,再进行后续的操作。

2.  网站服务器软件/ 配置 /php 程序存在漏洞,被利用
在讨论这个问题前,先说明文件及进程权限的几个概念:
A. FTP用户对网站目录具有最大修改权限,那么网站的文件所有者一定属于 FTP,  这是毋庸置疑的 , 否则如何修改文件呢?
B. php-fpm进程, nginx 进程对网站文件至少需要有读取权限,例如,以下命令即可查看这两个进程所使用的账号:
服务器安全
服务器安全
通过上图,我们可以发现,nginx 和 php-fpm 子进程账号是 nobody 。

我们再查看网站文件目录的权限:
服务器安全
发现网站文件所有者是www 账号,那说明:
| nginx和 php 对网站只有读取权限,无写入权限
l 如果php 程序需要对网站某些文件有写入权限,需要手工将文件或目录权限修改为 777
l 因为php-fpm 子进程是以 nobody 运行,那么 php-fpm 生成的新文件所有者也是 nobody, 这时 ftp 用户将无法修改这些文件,解铃还需系铃人,当 php 生成文件后,需要调用 chmod(“/somedir/somefile”, 0777) 将文件权限修改为 777 ,以便 FTP 用户也可以修改这个文件。
l 经常有开发人员找我请求重设php 生成的文件的权限。

l 如果php-fpm 子进程以网站文件所有者用户运行,那意味着 php-fpm 进程对整个网站目录具有可写权限,噩梦也就由此开始。

但是我们发现,有不少系统管理员为了省事,违背了Linux 最小化权限的原则,设置 php-fpm 进程以网站文件所有者账号运行,当然这样可能会方便 php 开发人员( php-fpm 进程对整个网站目录具有可写权限),但是这样一来, Linux 体系的文件系统权限原则将被打破,所有的安全措施将形同虚设。可以想象的是,万一 php 程序中有漏洞,攻击者上传木马,便可以修改网站的所有文件,网站首页被黑,也就不足为怪了。

退一步,如果我们设置了较严格的权限,就算php 程序中存在漏洞,那么攻击者也只能篡改权限为 777 的目录,其它的文件是无法被改写的,网站不就就得更安全了吗?

核心总结:php-fpm 子进程所使用的用户,不能是网站文件所有者。 凡是违背这个原则,则不符合最小权限原则。

经过我参阅网上关于nginx, php-fpm 配置的文章教程和市面上的一些书籍,发现有不少人受这些文章的误导,直接让 php-fpm 子进程以网站所有者账号运行,例如张宴的《实战 nginx 取代 apache 的高性能 Web 服务器》一书的 52 页中,存在以下设置:
www
www

而在第50 页,设置网站文件所有者也为 www 用户:
chown -R www:www /data0/htdocs/blog
显然,此书的这部分内部,对初学者有误导,针对这个问题,我已经向本书作者发邮件,希望其能在第二版中进行强调声明,以免由于过度宽松的权限配置,造成一些安全隐患。

官方提供的配置文件中,php-fpm 子进程使用 nobody 用户,这完全是合理的,无须修改。

那么nginx 的子进程用户,如何设置合理? 我的建议是也使用 nobody (对错误日志写入等无影响),设置方法如下:
nginx.conf文件第一行设置为 user nobody; , 再执行 nginx -s reload 即可。

php-fpm子进程用户设置方法:
编辑文件php-fpm.conf (一般位于 /usr/local/php/etc/php-fpm.conf, 视安装参数为准),找到 user 、 group 两个参数的定义,将其设置为nobody( 默认已经是 nobody) ,再重启 php-fpm 进程即可。

网站可写目录的特殊注意
这里的可写,是相对php-fpm 子进程而言。一个网站最容易出安全问题的即是可写目录,如果可写目录权限能控制严格,安全系数也将大大提高。
我们认为,一个网站可写目录主要分为以下几种:
1.  php 数据缓存目录,如 discuz 的 forumdata 目录,就存放了大量数据缓存文件。此类目录一般会禁止用户直接访问,但是 discuz 在这个目录下又存放了不少 js, css 文件,我们并不能简单地拒绝用户访问这个目录。显然,这个目录下的所有文件,不能直接交给 php 解析,我们后面会给出解决方案。
2.  附件上传目录。显然此类目录需要开启访问,但不能交由php 引擎解析(即这个目录下的所有文件均视为普通静态文件)。
3.  静态文件生成目录,这类目录下的文件全部应视为静态文件。
4.  日志目录, 一般都会拒绝用户直接访问之。

也就是说对网站开发人员而言,需要对可写目录实现动静分离,不同性能的文件,应该区别对待之,这样也就方便系统管理员,设置合理的nginx 规则,以提高安全性。

简单地去掉php 文件的执行权限,并不能阻止 php-fpm 进程解析之。

接下来,根据以上总结,系统管理员如何配置nginx 的目录规则,才更安全呢?
1.  数据缓存目录 /cache/
这个目录的特点是需要777 权限,无须提供给用户访问,那么可以按以下参考配置 nginx
location ~ “^/cache” {
return 403;
}

location ~ “.php$” {
fastcgi_pass 127.0.0.0:9000;
………………..
}

这时,任何用户将无法访问/cache/ 目录内容,即使
2. 附件上传目录 attachments
此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)
location ~ “^/attachments” {

}

location ~ “.php$” {
fastcgi_pass 127.0.0.0:9000;
………………..
}

注意,上面对attachments 目录的 location 定义中是没有任何语句的。 nginx 对正则表达式的 location 匹配优先级最高,任何一个用正则表达式定义的 location, 只要匹配一次,将不会再匹配其它正则表达式定义的 location 。

现在,请在attachments 目录下建立一个 php 脚本文件,再通过浏览器访问安,我们发现浏览器提示下载,这说明 nginx 把 attachments 目录下的文件当成静态文件处理,并没有交给 php fastcgi 处理。这样即使可写目录被植入木马,但因为其无法被执行,网站也就更安全了。

显然,重要的php 配置文件,请勿放在此类目录下。

3.  静态文件生成目录 public
这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。
可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777 的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。

但是网站可写目录的作用及权限,只有开发人员最为清楚。这方面需要php 开发人员和系统管理员积极沟通。我们使用的方式是:项目上线前,开发人员根据以文档形式提供网站可写目录的作用及权限,由系统管理员针对不同目录进行权限设置。任何一方修改了网站目录权限,但未体现到文档中,我们认为是违反工作流程的。
原文:http://zhangxugg-163-com.iteye.com/blog/1171572

使用apache2-mpm-itk以不同用户运行apache虚拟主机

我们运行在apache的虚拟主机,有时候为了安全,需要为每个网站以不同的用户运行,这样当虚拟主机中的一个网站被入侵时,而不会影响到其它的虚拟主机。我们这里使用apache2-mpm-itk补丁来实现这种功能。

1、下载apache2和itk

到apache2-mpm-itk网站下载最新版的补丁http://mpm-itk.sesse.net/

  1. wget  http://apache.ziply.com//httpd/httpd-2.2.21.tar.gz
  2. tar xzvf httpd-2.2.21.tar.gz
  3. wget http://mpm-itk.sesse.net/apache2.2-mpm-itk-2.2.17-01.patch

2、为apache2打上mpm-itk补丁

  1. cd httpd-2.2.21
  2. patch -p1 < ../apache2.2-mpm-itk-2.2.17-01.patch
  3. autoconf

3、编译apache2

编译apache2时,带上编译选项–with-mpm=itk,如:

  1. ./configure –with-mpm=itk
  2. make
  3. make install

4、配置apache2

  1. <VirtualHost *:80>
  2. ServerName www.example.com
  3.  
  4. <IfModule mpm_itk_module>
  5. AssignUserId siteuser sitegroup
  6. </IfModule>
  7. </VirtualHost>

sitesuer是指apache以siteuser用户运行
sitegroup是指apache以sitegroup用户组运行

rsync错误:@ERROR: auth failed on module XXX 的原因之一

在Linux下使用rsync,将远程目录下的文件同步到本地目录时,可能会出现以下错误:
@ERROR: auth failed on module XXX
其中,XXX 表示你的远程rsync服务模块名称。
出现这种情况,先检查你的用户名和密码是否正确,如果都正确,有一个可能是原因是:远程rsync服务器的帐户密码文件的权限必须为600,例如,你在rsyncd.conf中设置了secrets file = /etc/rsyncd/rsync_pwd
那么你就必须确保rsync_pwd的访问权限为600:
chmod 600 /etc/rsyncd/rsync_pwd
然后你的问题可能就解决了。
来源:http://blog.csdn.net/learnhard/article/details/5542765

使用MySQL自带工具mysqlhotcopy快速备份mysql数据库

mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中。
  与mysqldump比较:
  1、前者是一个快速文件意义上的COPY,后者是一个数据库端的SQL语句集合。
  2、前者只能运行在数据库目录所在的机器上,后者可以用在远程客户端,不过备份的文件还是保存在服务器上。
  3、相同的地方都是在线执行 LOCK TABLES 以及 UNLOCK TABLES
  4、前者恢复只需要COPY备份文件到源目录覆盖即可,后者需要导入SQL文件到原库中。(source 或 mysql < bakfile.sql)
  5、前者只适用于 MyISAM 引擎,而后则则可同时使用于MyISAM引擎和InodDB引擎.
  6、前者在使用前必须安装perl-DBD-mysql包,而后者则不需要.
使用mysqlhotcopy之前需要安装perl-DBI和DBD-mysql:
1、执行yum install perl-DBI安装perl-DBI。
2、执行yum install perl-DBD-MySQL或者http://devops.webres.wang/2011/11/linux-install-perl-dbd-mysql/
一个常用的备份例子:

  1. /usr/local/mysql/bin/mysqlhotcopy -u root -proot –addtodest 数据库名1 数据库名2  备份目录

–addtodest的意思是当备份存在时,不中断备份,只添加新的文件进去。
更多的选项可以执行/usr/local/mysql/bin/mysqlhotcopy –help查看。
如何还原?
1、停止mysql服务器。
2、复制备份的数据库目录到mysql数据目录下。
3、更改目录所有者为mysql服务器运行的用户(如mysql)。
4、启动mysql服务器

Linux安装perl DBD-mysql驱动

到http://www.cpan.org/modules/by-module/DBD/找到最新的版本,现在最新的为DBD-mysql-4.020.tar.gz
开始下载安装:

  1. wget http://www.cpan.org/modules/by-module/DBD/DBD-mysql-4.020.tar.gz
  2. tar xzvf DBD-mysql-4.020.tar.gz
  3. cd DBD-mysql-4.020
  4. perl Makefile.PL –mysql_config=/usr/local/mysql/bin/mysql_config
  5. make
  6. make install

请确保mysql_config的路径正确。