linux下进入乱码目录

若一个目录在用户上传后是乱码,如何进入此目录呢?

1. 若首字母是英文或数字,可以输入首字母后通过tab补齐方式进入。

2. 可通过inode更名方式进入:

使用inode,重新命名。
$ ls -i1
获取inode是多少
$ find -inum $inode -exec mv {} $new_file_name \;
使用find命令重新命名,其中$inode是上一步ls获取到的数字,$new_file_name是新的文件名。

3. 可以通过mc命令菜单式进入(最简单直接)。

基于ibdata1的mysql数据库恢复

服务器的阵列坏掉后,数据恢复公司进行了抢救后,大部分数据都恢复回来。但MYSQL数据库发现仅恢复了部分数据,即部分数据库是完整的,其他的库仅恢复了空表。其中有一个很大的文件,即ibdata1,约200多GB,估计可以用来恢复数据库。

网上搜索后,发现是可行的,处理方法如下:

1. 在一台新机器上搭建相同的系统环境,包括一个全新的mysql环境。
2. 停止mysql服务。即sudo service mysql stop
3. 将恢复后的ibdata1、ib_logfile*文件拷贝到新机器的/var/lib/mysql/目录下,覆盖之前的文件。同时修改/etc/mysql/my.cnf文件,在mysqld部分添加:
[mysqld]
innodb_force_recovery = 6

4. 拷贝需要恢复的数据库文件(空表,即包括*.frm文件的目录)到新机器的/var/lib/mysql/目录下
5. 重启mysql服务,即sudo service mysql start,然后用mysql命令检查数据是否有恢复。若能恢复回来,则可以用mysqldump进行备份导出。

在ubuntu服务器上使用dell md3060e及其管理程序

之前采购了一批服务器和存储,几经折腾后最终安装在学校的机房。服务器上安装了ubuntu 14.04系统,存储是dell的直连存储md3060e(我第一次用这个设备),硬件上安装好后发现不知道怎么做RAID。于是在dell官网上找到了对应的程序,发现有个linux版本的程序:StorageEnclosureManagement,“号称”可以支持debian和ubuntu。

DELL的官方程序下载地址上是这样描述的:

Debian74 Storage Enclosure Management Software 1.3

Storage Enclosure Management Software for MD3060e JBOD Arrays, version 1.3, Debian74 installer
Fixes & Enhancements
Fixes:
-New OS support for Ubuntu 14.04, SLES 12, and ESXi 5.5 (CLI only).
-Implement build version number.
-6TB 4096n support.
-Ability to update HBA adapter firmware
–LSI 9207-8e
–LSI 9206-16e

之前的1.2版本声明是支持ubuntu 12.04版本。但这个版本我下载后在ubuntu 14.04上无法安装,提示为不支持的操作系统。

Warning: This OS is unsupported: debian14.04. Installer will now exit.

于是,尝试修改系统的发行版本信息,看看能不能骗过安装程序的监测。

sudo nano /etc/lsb-release
将其中的版本信息修改为debian wheezy 7.4。

修改完成后,可以正常安装了。

BTW:本来我还以为md3060e可以直接支持raid,但搜索一圈下来,发现这是个“直连”系统,意思是本身不支持RAID?Dell的技术支持也不是很靠谱,两圈电话问下来,也没有解决问题。最后给我推荐安装DELL的MDSM软件,但这个软件本身也不支持md3060e,还是需要其他MD3主控阵列才可以。因此要考虑使用mdadm或lvm来软管理这个磁盘柜了。

ubuntu不能挂载iso文件问题

我的mac升级后突然发现使用Virtualbox虚拟的ubuntu 15.10有点问题,于是想重新安装Virtualbox Guest Additions,但从菜单上挂载出现问题,于是尝试用命令行挂载:

sudo mount -o loop VBoxGuestAdditions.iso tmp

 

提示有错误:

mount: unknown filesystem type ‘iso9660’

这个错误非常奇怪,第一次遇见。搜索后发现一个相关性很高的帖子:

http://ubuntuforums.org/showthread.php?t=1314412

按照帖子里给出的尝试步骤,发现使用这个命令就可以解决(之前尝试了几次apt-get update & dist-upgrade,都没有解决):

cd /lib/modules/4.2.0-21-generic/kernel/fs/isofs

sudo insmod ./isofs.ko

 

然后就可以挂载iso文件了。

使用 nginx+Tilestache 构建瓦片地图

之前有介绍 “使用tilestache构建瓦片地图服务器”,在我们的服务器上使用一段时间后,发现用其作为server,稳定性有一定问题。因此就考虑使用nginx直接提供静态地图文件,而只使用tilestache来生产瓦片。tilestache的瓦片缓存是按照一定的目录规则来实现的,即在url中表现为/layername/level/x/y.png,而在磁盘上存储的方式为/layername/level/umask/x/umask/y.png,所以需要进行rewrite转向。网上搜索后发现已经有人解决了这个问题:

http://andyfiedler.com/blog/using-nginx-to-proxy-tilestache-180/

 

在服务器上,按照上述的修改,即可满足实际需求。

 

ipv6域名强制解析为ipv4地址

今天使用数据中心的DOI注册功能后,突然发现后台验证的功能无法使用。代码没有动过,怀疑是服务器升级导致产生的,于是再本地升级到最新版后再进行测试发现正常,在服务器上升级后仍然有错误。看了代码,错误是在这一句导致的:

$content=@file_get_contents("http://dx.doi.org/".$row['doi']);

感觉这个代码应该没有问题,ping一下对应的网站,发现其默认是解析到ipv6网络了,同时ipv6网络不通,所以导致了这个问题。

临时解决办法:在/etc/hosts中将对应的域名直接解析为ipv4地址。

管理ubuntu服务器上的阵列

一台DELL R710服务器,ubuntu server系统,基于自身6块硬盘,做了一个RAID5,但最近有一块硬盘坏掉了,让服务商换了一块上来。今天想远程看看这块硬盘是否起作用了,没有找到合适的方法,于是一通搜索开始学习。

1. 确认服务器上的阵列卡

lspci -v | grep LSI

 

如果能看到对应的输出,说明采用的是主板上的LSI RAID卡,需要megacli命令来控制。

2. 安装megacli命令

从LSI官网找到对应的下载链接,在本机下载后,再scp到服务器上(不能直接在服务器上wget获取),然后解压,进入Linux目录,有一个rpm安装文件。因为服务器是ubuntu,所以使用一个命令来进行处理:

apt-get install rpm2cpio

rpm2cpio MegaCli-*.rpm | cpio -idmv

 

 

即将rpm安装包的内容直接提取出来。进入提取后的目录,可以发现有一个opt/MegaRAID/MegaCli目录,将这个目录的MegaCli64命令拷贝到/usr/loca/sbin/目录下(服务器是64位系统)。

sudo cp MegaCli64 /usr/local/sbin/

 

然后还可以从参考1中添加一个lsi.sh脚本来更容易的和RAID交互(注意脚本中的参数需要和机器上的实际进行修改,即:

# The identifying number of the enclosure. Default for our systems is "8". Use
# "MegaCli64 -PDlist -a0 | grep "Enclosure Device"" to see what your number
# is and set this variable.
ENCLOSURE="8"

 

参考1中的默认值是8,服务器上的是32。

3. 使用和问题处理

sudo lsi.sh drives

 

发现有一个问题:

Slot Number: 0 - Online, Spun Up
Slot Number: 1 - Online, Spun Up
Slot Number: 2 - Online, Spun Up
Slot Number: 3 - Online, Spun Up
Slot Number: 4 - Online, Spun Up
Slot Number: 5 - Unconfigured(good), Spun Up

 

第6块硬盘,即slot5,是新加的,虽然识别了,但未配置。

sudo lsi.sh status

结果如下:

 

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :disk1
RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3
Size : 4.545 TB
Sector Size : 512
Parity Size : 931.0 GB
State : Degraded

 

注意,State这行的状态是degraded,说明raid5状态没有起来,新加的这块盘没有发挥作用。

于是继续搜索,寻找让其能rebuild的方法,从参考2中找到了一个对应的方法:

MegaCli64 -PdReplaceMissing -PhysDrv[32:5] -array0 -row5 -a0

MegaCli64 -PDRbld -Start -PhysDrv[32:5] -a0

 

 

这样就开始rebuild了。

参考:

1. MegaCLI Scripts and Commands

2. RAID: Rebuilding a Foreign disk by hand

git检出单独一个分支

有时候,只想从版本库中clone出一个单独的分支来(比如,网站发布的代码),其他相关分支并不需要检出。

这时直接使用 git clone出整个版本库就显得不合适了。搜索了一下,发现这个需求很多,在stackoverflow上有几个相关答案:

这个问题里,回答中最认可的是这个:

git clone <url> --branch <branch> --single-branch [<folder>]

 

但这个回答和我的实际情况稍有不同,我的代码之前是用svn管理的,在服务器上已经使用svn方法发布了,使用这个命令就提示错误了:

git clone  -b qinghaihu --single-branch .

因为当前目录上已经有对应文件了,若是发布到一个新目录下则没有这个问题。

从另一个问题中找到了答案:

即:

cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout -f $BRANCH

注意最后一个checkout命令加了一个-f参数,这样就可以强制覆盖已有文件。

基于git实现多分支的自动发布

前面使用了gitincron进行了网站的自动发布,但一个git版本系统里的多个分支要是同时发布在一台服务器上,则显得太冗余。因此需要处理多分支的自动发布方案。

在此处找到了解决方案:

http://www.ekynoxe.com/git-post-receive-for-multiple-remote-branches-and-work-trees/

结合incron技术,最终的解决方法就是修改post-receive钩子:

#!/bin/bash
  while read oldrev newrev ref
  do
    branch=`echo $ref | cut -d/ -f3`

    if [ "master" == "$branch" ]; then
      date +"%Y-%m-%d %H:%M:%S" >> /home/wlx/westdc.git/hooks/westdc.update.lck
    fi

    if [ "heihedata" == "$branch" ]; then
      date +"%Y-%m-%d %H:%M:%S" >> /home/wlx/westdc.git/hooks/heihedata.update.lck
    fi

    if [ "card" == "$branch" ]; then
      date +"%Y-%m-%d %H:%M:%S" >> /home/wlx/westdc.git/hooks/card.update.lck
    fi
  done

 

使用git进行分支间的合并

使用svn的时候,在分支之间的合并,使用svn merge进行操作,同时也可以合并部分目录和文件。

现在开始使用git,一开始只是知道git merge,将不同分支完整合并到另一分支。但我的实际需求是,将某一次或某几个commit,合并到几个不同的分支上。

搜索后发现可以使用git cherry-pick命令,可以非常好的解决这个需求。

 

参考:

http://stackoverflow.com/questions/881092/how-to-merge-a-specific-commit-in-git