Ubuntu修复grub开机引导

安装完Ubuntu忘记写入引导文件,或者使用工具调整分区后,很容易出现grub损坏无法进入系统的情况。
也可能是由于分区调整或分区UUID改变造成grub2不能正常启动,从而进入修复模式了(grub rescue),也称救援模式。

error : unknow filesystem
grub rescue >

在救援模式下只有很少的命令可以用:

(1)set     查看环境变量,这里可以查看启动路径和分区。
(2)ls      查看设备
(3)insmod  加载模块
(4)root    指定用于启动系统的分区,在救援模式下设置grub启动分区
(5)prefix  设定grub启动路径

具体修复步骤如下:

1、查看分区:

grub rescue> ls   //回车,会出现如下字样:
(hd0) (hd0,msdos6) (hd0,msdos5) (hd0,msdos1)

2、寻找ubuntu分区:

若包含/bin以及/sbin等目录,表示为主分区。
若包含/boot/grub或者/grub,即为启动分区。

grub rescue> ls (hd0,msdos1)/

3、修改启动分区:

假如你找到的主分区为(hd0,msdos6),grub所在路径是(hd0,msdos1)/grub

grub rescue > root=hd0,msdos1
grub rescue > prefix=/grub    //grub路径设置
grub rescue > set root=hd0,msdos1
grub rescue > set prefix=(hd0,msdos1)/grub
grub rescue > insmod normal   //启动normal启动
grub rescue > normal

之后你就会看到熟悉的启动菜单栏了

4、进入命令行启动ubuntu

进入系统启动选项界面后还是进不去,按C进入命令行模式

grub > set root=hd0,msdos1
grub > set prefix=(hd0,msdos1)/grub
grub > linux /vmlinuz-xxx-xxx root=/dev/sda6 //按Tab键自动补全,若acpi有问题,在最后添加acpi=off
grub > initrd /initrd.img-xxx-xxx
grub > boot

这样就可以进入了

5、进入ubuntu修复grub

sudo update-grub
sudo grub-install /dev/sda

6、重启,搞定!!

Linux下SCSI磁盘热插拔

维护服务器时,有可能需要热插拔硬盘,但是Linux好像并不买单,不会自动检测磁盘的装卸,为此热插拔后,我们需要通知Linux服务磁盘状态。

#添加磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#删除磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#查看磁盘
cat /proc/scsi/scsi
#命令输出
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR00 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 01 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02

参数解析:
HOST 是硬盘所在SCSI控制器号(本例中,磁盘所在通道为2);
CHAN 是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
DEV 是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
LUN 是硬盘的lun号(默认情况都是0)

让Ubuntu支持exfat格式的U盘

add-apt-repository ppa:relan/exfat 
apt-get update

apt-get install exfat-fuse

mkdir /mnt/exfat
mount.exfat-fuse /dev/sdc1 /mnt/exfat

add-apt-repository 是由 python-software-properties 这个工具包提供的,只有 ubuntu 09.10 之后版本支持。

/etc/syslog.conf文件解读

1: syslog.conf的介绍

对于不同类型的Unix,标准UnixLog系统的设置,实际上除了一些关键词的不同,系统的syslog.conf格式是相同的。syslog采用可配置的、统一的系统登记程序,随时从系统各处接受log请求,然后根据/etc/syslog.conf中的预先设定把log信息写入相应文件中、邮寄给特定用户或者直接以消息的方式发往控制台。值得注意的是,为了防止入侵者修改、删除messages里的记录信息,可以采用用打印机记录或采用方式来挫败入侵者的企图。

2: syslog.conf的格式

/etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进行分隔(使用空格间隔是无效的)。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。如下行所示:
类型.级别 [;类型.级别] TAB 动作

2.1 类型
保留字段中的“类型”代表信息产生的源头,可以是:

auth    认证系统,即询问用户名和口令
cron    系统定时系统执行定时任务时发出的信息
daemon  某些系统的守护程序的syslog,如由in.ftpd产生的log
kern    内核的syslog信息
lpr     打印机的syslog信息
mail    邮件系统的syslog信息
mark    定时发送消息的时标程序
news    新闻系统的syslog信息
user    本地用户应用程序的syslog信息
uucp    uucp子系统的syslog信息
local0-7 种本地类型的syslog信息,这些信息可以又用户来定义
*       代表以上各种设备

2.2 级别
保留字段中的“级别”代表信息的重要性,可以是:

emerg   紧急,处于Panic状态。通常应广播到所有用户; 
alert   告警,当前状态必须立即进行纠正。例如,系统数据库崩溃; 
crit    关键状态的警告。例如,硬件故障; 
err     其它错误; 
warn    警告; 
notice  注意;非错误状态的报告,但应特别处理; 
info    通报信息; 
debug   调试程序时的信息; 
none    通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除邮件信息外其它信息都送出。

2.3 动作
“动作”域指示信息发送的目的地。可以是:

/filename   日志文件。由绝对路径指出的文件名,此文件必须事先建立; 
@host       远程主机; @符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。
user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息; 
*           所有用户。所有已登录的用户都将收到信息。

3: 示例
我编译的MiLinux中使用了如下配置

# First some standard log files.
*.*;auth,authpriv.none;mail.none        /var/log/syslog
*.alert;*.crit;*.err                    /var/log/syserr
auth,authpriv.*                         /var/log/auth.log
mail.*                                  /var/log/mail.log
# Emergencies are sent to everybody logged in.
*.emerg                                :omusrmsg:*

Ubuntu下使用Subversion(SVN)来管理Nginx网站发布

这里我将讲解如何利用SVN来管理网站的发布,这次环境仍然是Ubuntu,预装了SVN和Nginx,SVN服务已经启动,版本库已经建立并完成项目提交。

假设版本库路径为/var/lib/svn/project1,web发布路径为/srv/webroot/project1。

当我们在客户端将Web项目代码提交(commit)到project1代码库中时,如何自动更新/srv/webroot/project1的Web发布路径的内容呢?

首先,我们需要checkout一次,把库的文件checkout到Web路径下:

svn co svn://localhost/project1 --username bob --password 123456

其次,修改/var/lib/svn/project1/hooks/post-commit,如果没有则建立一个:

#!/bin/sh
export LANG=en_US.UTF-8
svn up /srv/webroot/project1 --username bob --password 123456 --no-auth-cache

注意–no-auth-cache,否则会提示验证信息ATTENTION! Your password for authentication realm导致执行失败。

最后,为post-commit文件增加执行属性:

chmod +x post-commit

完成上述步骤后,试试从客户端提交代码到版本库中,看看Web内容是不是也改变了?

Ubuntu不使用Apache架设Subversion(SVN)服务器

低配置的Ubuntu服务器,想架设个Subversion(SVN)服务器用来托管部分代码,服务器上原先装有Nginx,故不想安装Apache,操作过程总结如下。

  1. 安装Subversion工具
aptitude install subversion subversion-tools
  1. 建立SVN仓库,创建名称为project1的项目
mkdir /var/lib/svn 
svnadmin create /var/lib/svn/project1
  1. 修改配置文件/var/lib/svn/project1/conf/authz,添加授权认证信息

比如将bob加入管理员组,并对其添加读写权限,内容如下:

[groups]
admin = bob #将bob添加到admin组

[/]
bob = rw #成员bob对/目录的权限:r读,w写
  1. 修改配置文件/var/lib/svn/project1/conf/passwd添加用户密码
[users]
bob = 123456
  1. 修改配置文件/var/lib/svn/project1/conf/svnserve.conf
anon-access = none
auth-access = write
password-db = passwd #指定密码文件
authz-db = authz #指定授权认证文件
realm = My Project1 repository
  1. 临时启动svnserv服务程序。
svnserve --daemon --listen-port 3690 --root /var/lib/svn

这里也可以通过–listen-port参数指定监听端口。

  1. 首次提交项目文件,假设我们的项目文件临时存放于/tmp/project1里,那么命令可以如下:
svn import /tmp/project1 svn://localhost/project1 -m "Initial import"

当出现“Committed revision 1”时说明首次提交完成。

到第7步完成时,说明我们的SVN仓库已经建立,并且可以使用了,我们可以在客户机上尝试checkout了。

Ubuntu使用基于密匙的安全验证

按照下列步骤操作后,您的服务器上root账户将无法使用密码登陆,而只能使用生成的密匙登陆。

一、安装必须的SSH服务

sudo apt-get install ssh

二、修改SSH配置文件

vi /etc/ssh/sshd_config
PermitRootLogin without-password

三、生成私钥和公钥

ssh-keygen -t rsa
mv id_rsa.pub authorized_keys

ssh-keygen 全部使用默认值,然后会在用户目录生成如下文件:

~/.ssh/id_rsa 私钥;可以保存到U盘或者邮箱中
~/.ssh/id_rsa.pub 公钥;改成系统默认识别的authorized_keys

四、使用私钥登陆服务器

若客户端是Linux,复制私钥id_rsa到本地同名用户/.ssh/id_rsa,然后使用ssh server-ip即可直接登陆。

MySQL找回root密码的方法

方法一(通用):

1.在my.cnf或my.ini中的[mysqld]字段加入skip-grant-tables,免认证登录

2.重启mysql服务,进入CLI模式

#使用root用户
mysql -uroot

3.在mysql命令行修改root密码

use mysql;
update user set authentication_string=password('newpassword') where user='root';
flush privileges;

# mysql old version
#update user set Password=password('newpassword') where user='root';

4.去掉my.cnf或my.ini中的skip-grant-tables,重启mysqld

方法二(Debian系统):

类Debian系统可直接使用/etc/mysql/debian.cnf中[client]节提供的密码登录

#查看系统保留密码
cat /etc/mysql/debian.cnf
#使用系统用户登录
mysql -udebian-sys-maint -p

修改Ubuntu的ulimit文件句柄数限制

最近,网站服务器CPU经常就会飙升到100%,但内存,IO,网络等一切正常,今天忽然想起有可能是ulimit的问题,马上查看文件句柄数限制

ulimit -n

得到的结果是:5120,这个值对生产中的服务显得偏小。

网上给出的解决方案,大部分是直接输入

ulimit -SHn 102400 # 102400可自己根据应用调整

此法缺点很明显,一旦退出登陆立即失效。

下面给出正确的解决办法:

1.修改/etc/security/limits.conf子配置,命令如下

echo * - nofile 102400 >> /etc/security/limits.d/nofile.conf
echo root - nofile 102400 >> /etc/security/limits.d/nofile.conf

重新登录查看是否生效。若未生效,请继续深入~

2.编辑/etc/pam.d/su,取消如下行注释

session required pam_limits.so

重新登录查看是否生效。若未生效,请继续深入~

3.编辑/etc/profile,加入一行

ulimit -SHn 102400

重启服务器,再次登陆,查看句柄数,已经正确设置为102400。

如果有碰到类似情况,可以检查一下看看是不是文件句柄数设置太小引起的。

Ubuntu12.04安装QQ2012

关于在Ubuntu12.04上安装QQ2012这个问题,我在网上找了几篇文章,均感觉很复杂,特别是安装msxml之类的库,竟然说要手动安装,这不是辱没linux系统的命令行特性么。哎,是在无语了。我总结如下命令安装qq2012,运行正常,但登陆的时候只能使用qq自带的虚拟键盘,否则应用程序会崩溃

#安装wine
sudo apt-get install wine
#安装字体和运行库
winetricks allfonts gdiplus riched20 vcrun6 vcrun2005sp1 msxml6 ie8 flash
#安装QQ2012Beta2
wget http://dl_dir.qq.com/qqfile/qq/QQ2012/QQ2012Beta2.exe
wine QQ2012Beta2.exe
rm QQ2012Beta2.exe

如何运行qq呢?

wine "~/.wine/drive_c/Program Files/Tencent/QQ/Bin/QQ.exe"