MySQL can’t change data dir & SELinux


这两天在迁移mysql data dir的时候,发现新的data dir /data/mysql 在权限设置都正确的情况下,还是会报 Can’t change dir to ‘/data/mysql’ (Errcode: 13) 。ErrCode 13也确实就是反映权限问题。网上查询了半天,查出有可能是SELinux的设置。于是,把SELinux关掉再重启mysql,starting mysql [OK]。

问题解决了,但是解决方式简单粗暴 =。= ,直接关掉SELinux。从安全方面考虑,这种方式不提倡。

so,研究研究SELinux吧。原以为SELinux会很难懂,我很怕这种权限问题,一看就觉得头大。读完Vincent Danen的这三篇关于SELinux的文章SELinux的Wiki,之后,其实觉得SELinux也没我想象中那么complicated。

首先,SELinux是什么。简单说,SELinux帮助控制applicates可以访问哪些资源,这可以帮助我们阻止非法的访问请求。就像mysql,默认的SELinux只会把/var/lib/mysql作为MySQL可以访问的数据资源,而我们更改为/data/mysql下,就需要做额外的SELinux配置。

了解了SELinux是什么,找台机器试验一下。先看看系统环境,系统版本为centos 6.0。

    [root@lxnaevcj ~]# head -n 1 /etc/issue
     CentOS Linux release 6.0 (Final)

获取当前SELinux情况。

    [root@lxnaevcj ~]# getenforce
     Enforcing

SELinux有三种状态,Enforcing(1),Permissive(0) 和 Disabled。Enforcing表明系统处于SELinux保护中,任何不合法的请求将被deny和report;Permissfive不阻止非法请求只进行report,Disabled则无任何操作。在Enforcing和Permisive这两种状态中切换只需要setenforce 0 或者setenfore 1,切换到disabled或者从disabled切到其他状态则需要更改/etc/sysconfig/selinux中的配置并重启机器。

SELinux中主要有4个概念,Users,Roles,Types 和Contexts。SELinux Users以_u结尾,Roles以_r结尾,Types为_t,Context(也被成为label) 则是一个进程或者一个文件的属性,用于表明进程访问这个文件的合法性。一个用户进程通常拥有f user_u:user_r:user_t的 context而用户的home目录则是user_u:object_r:user_home_t的context。

查看/var/lib/mysql的context,用 ls -Z命令。

可以看到mysql文件夹的权限为

drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql

也就是用户为system_u,角色为object_r,type为mysqld_db_t,s0是MLS range。

再看看/data/mysql的权限

drwxr-xr-x. mysql mysql system_u:object_r:default_t:s0 mysql

Type不一样,因此chcon -R -t mysqld_db_t /data/mysql 更改type为 mysqld_db_t

好,启动mysq。/etc/init.d/mysql start

=====================我是意外的分割线====================

重启MySQL竟然失败了,报的错还是和以前一样,Can’t change dir to ‘/data/mysql/’ (Errcode: 13)。这不能忍了。。SELinux的设置难道还是不对么!SELinux你是个大骗纸么!(ivy在卖萌了)

逼ivy开大啊,看log,troubleshotting SELinux,第五节。

下载了sealert,并且将audit log转为可读模式,然后仔细研究log发现一句话。

SELinux is preventing /usr/libexec/mysqld from search access on the directory /data.

If you want to allow mysqld to have getattr access on the data directory
Then you need to change the label on /data

Do
# semanage fcontext -a -t FILE_TYPE ‘/data’

where FILE_TYPE is one of the following:。。。。。

Then execute:
restorecon -v ‘/data’

果断尝试一下,semanage fcontext -a -t mysqld_db_t ‘/data’ ;restorecon -v ‘/data’

终于,MySQL启动成功。

原来还涉及到/data这个文件目录的权限,默认的/var/文件夹type为var_t,/var/lib的type为var_lib_t,这两种type应该mysql也能访问。

最后展示下所有相关文件的SELinux权限和用户。

system_u:object_r:mysqld_db_t:s0 /data

system_u:object_r:mysqld_db_t:s0 /data/mysql

/data/mysql里所有文件 unconfined_u:object_r:mysqld_db_t:s0



centos python2.4.3升级到2.6.5 并重装cherrypy和mysql-python


之前python一直用的2.4.3的环境,没有用到什么2.6的feature也就没出什么问题;突然某一天,用了另外一个同事的lib,逼得我升级python了。系统是centos5.5,上面已经装有cherrypy和mysql-python,所有相关的都需重装。在网上搜了一篇文章 CentOS 5.5 中 Python 升级到 2.6.5和一些帖子,这里写个总结
1、下载Python2.6.5
wget http://www.python.org/ftp/python/2.6.5/Python-2.6.5.tar.bz2
2、解压
tar jxvf Python-2.6.5.tar.bz2
3、编译安装
cd Python-2.6.5
./configure
make
make install
Python 默认安装目录在/usr/local/lib/python2.6
4. mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python2.6 /usr/bin/python
5. yum据说是依赖是python2.4.3
所以vim /usr/bin/yum ,将首行显示的 !#/usr/bin/python 修改为 !#/usr/bin/python2.4。
6. 重装cherry
下载cherrypy安装包,解压cd进去,读README文件看怎么安装。
7. 重装setuptools
下载setuptools,注意不用python版本对应的setuptools。现在我的python版本是2.6.5,因此下载setuptools-0.6c11-py2.6.egg。
sh setuptools-0.6c11-py2.6.egg
7 . 重装Mysqldb-python
下载MySQL-python-1.2.3.tar.gz ,解压cd进去 ,同样查看README看怎么安装。
site.cfg里有个配置是mysql_config,因为我的mysql安装路径不是默认的而是自己的/usr/local/mysql5.1/,所以在site.cfg里配置mysql_config为自己的路径,再执行以下2步。
$ python setup.py build
$ sudo python setup.py install # or su first
8. 这时我再去启动我的cherrypy程序,发现依然报错,
ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory
网上搜了下,解决方案如下:
ln -s /usr/local/mysql5.1/lib/mysql/libmysqlclient_r.so.16 /usr/lib/libmysqlclient_r.so.16
再执行ldconfig
至此,所有安装完成。



java classloader


ClassLoader:类加载器,将java的类文件加载进jvm。

1. ClassLoader简介

jvm里有三种classloader,BootstrapClassLoader、ExtClassLoader和AppClassLoader。BootstrapClassLoader是jvm启动时时加载java核心API和ExtClassLoader和AppClassLoader,ExcClassLoader加载/lib/ext里面的类,AppClassLoader加载用户程序的ClassPath里的类。

ClassLoader是个抽象类,他有2个构造函数,ClassLoader()和ClassLoader(ClassLoader parent)。ClassLoader()使用ClassLoader.getSystemClassLoader()返回的ClassLoader构造一个ClassLoader,并将此ClassLoader作为父加载器;而ClassLoader(ClassLoader parent)则使用这个指定的父类加载器构造ClassLoader。

public class CustomClassLoader extends ClassLoader {
   public  CustomClassLoader() {
         super();
    }
}
public class TestClient {
    /**
     * The test entrance.
     * @param args
     */
    public static void main(String[] args) {
     CustomClassLoader loader =  new CustomClassLoader();
     System.out.println(ClassLoader.getSystemClassLoader());
     System.out.println(loader.getParent());
     System.out.println(loader.getParent().getParent());
     System.out.println(loader.getParent().getParent().getParent());
    }
}

输出的结果是:

sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$AppClassLoader@19821f

sun.misc.Launcher$ExtClassLoader@addbf1

null

没有指定parent的ClassLoader,他的父加载器由ClassLoader.getSystemClassLoader()指定,可以看出AppClassLoader的parent是ExtClassLoader,ExtClassLoader的父加载器被设为null。ExtClassLoader和AppClassLoader都由BootstrapClassLoader加载,但是他们的父加载器不一样。

MORE…



Java HotSpot VM


从大的方面说,java虚拟机分为2类:client和server。server端的程序,显然,更注重最大的满足peak的运行速度,而不是快的启动速度和小的内存占用。

Memroy Model

在java hotspot vm中,对象引用都用指针实现。

为了充分运用多核,JVM为Young提供了Parallel的GC,tracing和live对象的复制有多线程并行的实现。

而Full GC,JVM默认使用mark-compact 收集算法;对于那些使用大的heap,mark-compact 收集会导致程序的中断。因此,jvm提供另外一种并发的collector,concurrent mark-sweep collector,在程序运行时trace和sweep。现在的JVM对于FGC提供一种并行的mark-compact collector,concurrent mark-sweep为了减少暂停时间,parallel mark-compact collector旨在增加吞吐量。parallel mark-compact collector在stop-the-word的暂停时间中使用多线程同时Old GC。

Java HotSpot Compilers Overview

JIT编译器只在代码真正被执行的时候才将java字节码解释成本地机器语言。

Java HotSpot VM Advanced Features

Scalability:JHSVM会自动根据机器的处理器数量、RAM大小选择Client\Sever VM , yong和old区的大小。

Performance:除了object-oriented optimization,vm和jre提供了其他的优化,fast reflection和NIO。

Reliability, Availability and Serviceability

=============================================================================================================

Java HotSpot VM  调优

随着核数增加,GC时间增长,系统吞吐量会急剧下降。也就是说,在一个小的系统上一个无足轻重的速度因素在大的系统上就可能成为瓶颈。

从J2SE1.2之后,jvm就引入generational collection。 MORE…



仙剑4__生尽欢,死无憾


注:本来不想这么矫情的来写点什么,只是觉得不写的点什么又对不起我玩了接近40个小时。

看图说话。

仙四里面最喜欢的就是紫英,啊,我就是受不了这种面冷心热的型。在禁地外面,菱纱送了九龙缚丝穗给小紫英,紫英那个时候还是扭扭捏捏的不肯接受。后来到了封神陵为天河取那把后羿射日弓的时候,菱纱和天河在一旁亲亲我我,紫英被默默地晾在一边(抓狂啊!剧情里好多这样的情节,紫英完全被晾在一旁了,他明明也是喜欢菱纱的啊,菱纱不知道。纠结啊,小紫英啊,菱纱不要你,姐姐要你啊!)。菱纱和天河说完话,才想起一旁的紫英,菱纱不好意思的转过身,对紫英说没想到什么东西可以送,紫英只是说:

慕容紫英:不必……神兵利器,我并不稀罕,但你须记得自己的誓言,往后不可再因盗墓折去阳寿,这才是最重要的。

慕容紫英:今日之行我并不认同,但……如若取此弓会有任何报应,慕容紫英为朋友心甘情愿。 MORE…



第一次参加线下活动__团购,随便唠叨几句


        先要感叹一下,首都就是好啊,做IT就是要在北京发展啊,这种机会真多啊,还免费的啊…

        以下是正题。

       这次的活动主题是叩问团购价值,地点在世贸天阶的时尚大厦,离我住的地方真叫一个远啊。地铁坐了40分钟,再徒步20分钟,到了那边我腿都软了。然后由于我到的晚,现场的座位都没了,好吧,哥就站吧。不过站在后面有一个非常大的好处就是,我可以看到所有的人在做什么~~活动还没开始的时候,就看到大家在不停地交换名片。低调的我木有名片,低调地站在一旁,嗯,我低调地观察。活动开始,我就看到很多人手里拿了一叠花花绿绿的名片了,这个网那个网的。

       老实说,今天活动我倒没觉得有多精彩,可能这种线下交流的目的主要是让大家认识吧。几个嘉宾里面,就觉得F团创始人林宁的讲话还挺不错的。嗯,写一点我对他的讲话的记录,也引出自己的问题。以下是林宁讲话的节选(很节选,我用手机记的),括号里的字是我的想法。

   

       团购吸引人的重要因素就是价格,而以后团购网要做的是质量,是服务。

      ( 说到团购商家的质量,作为消费者,我无法判断商家的服务水平,我更关注于这次的团购是哪个网站发出的。如果是美团和糯米,我会非常相信他们所选择的商家。这种消费者对于团购网的信赖是怎么产生的,特别是小网站怎么让消费者产生信赖的?就我个人而言,我接触的第一个团购网站是美团,然后因为王兴,所以信赖美团的质量。而关于糯米是因为某次看到一条新闻,里面提到了美团和糯米,好吧,还是因为美团的原因。小的团购网站怎么获得这种消费者的信赖?我曾经在另外的团购网上买过东西,价钱没的说,但是寄过来的东西有一股味道,对这家网站也就放弃了。因为一次的团购产品不好而对这家网站失去兴趣,同时也让我也对那些小的团购网站产生怀疑。至少,在下次再团购时,如果是小的团购网站,我会多斟酌一下。

MORE…



Win7下VMware Ubuntu Host-only配置上网


今天只写步骤,技术说明我现在也不清楚。

1. 编辑Ubuntu下的DHCP配置,删除DHCP下全部内容并保存

sudo gedit /etc/dhcpd.conf

2. 主机中,网络与共享中心可以看到

本地连接是我主机的网络连接,本地连接2和本地连接3对应的是虚拟机,我的电脑中本地连接2对应的是VMnet1,查看VMnet1的IP(192.138.137.1)。在本地连接的属性中设置共享到VWnet。 MORE…



这一段时间在看的书、电影和电视剧


白夜行
他(亮司)不总是在人们看不见的地方守护雪穗吗?” 其实,亮司也是希望能在白天行走。白夜行白夜行,不禁为亮司叹息。
大明宫词
古灵精怪的太平,吓走了突厥王子,期待中的美爱情,最终却以悲剧收场。以杀戮开始的婚姻,从一开始就预示着不安。
姐姐的守护者
如果改变不了,就接受。只是若干年后还是会觉得悲哀,生活中竟有那么多的时刻没有一起分享。
人在囧途
看到同学的一篇校内日志,恩,喜欢李成功的老婆。温婉浓厚,淡然若定,她知道李成功要的是什么,她也知道李成功需要的是什么,所以她甘愿在背后等他,在他一转身就能看到的地方。
美丽最后在李成功箭头轻轻的那句“回家就好”,竟然让我泪流满面。



Java中容器总结


      这段时间看Java中的容器,一直被搞的有点混。加上JDK1.5和JDK1.6又有点区别,更是理不清。现在做个总结。 

      Collection: 

      先看看JDK1.5和JDK1.6下的容器中集合接口的树。 

1.6:                                                                                                             

    1.5:

     整体来说,Collection这个接口下的三个子接口还是List、Queue和Set,只不过1.6添加了几个子子接口。 

     在1.5和1.6里,List有以下两种类型:ArrayList和LinkedList。List接口的用户可以精确控制元素插入的位置,可以根据索引访问元素。从名字上可以看出这两种List的区别,一个基于Array存储,一个基于链表。这种存储方式的区别反映在他们在执行某些操作,如查找删除时,有着性能上的不同。另外,LinkedList包含的操作也对于ArrayList。要注意的是,ArrayList和LinkedList都是不同步,也就说在多个线程操作一个ArrayList/LinkedList同时其中一个线程改变了这个List的结构,那么它必须保持外部同步。Vector也是实现List的一个类,它可以实现可增长的对象数组,它的大小是可改变的;Vector是同步的。Stack继承于Vector,并扩展了5个方法。  MORE…



[Coding回忆文]08暑假,我的编程开始


         昨晚和网络部的同学吃饭,老部长的欢送会,席间也喝了一些小酒。很久没喝酒了,还是一如往常的喝一杯就上脸,然后手上还起了一些小红点。酒精过敏了,看来以后还是得少喝啊。

        一起吃饭的是网络部第一届和第二届的一些成员,还有班主任也在。吃饭中,洋姜突然提到大一的那个暑假我们南一楼的那个时候,现在想想也觉得挺感慨的,写篇文来纪念下。

         貌似是08年4月份的某个日子吧,在宿舍楼下的黑板上看到系网络部招新的通知,抱着学点技术以后好找工作的想法,又得知部门的指导老师是班主任,我就报名了。后来事实证明,技术的吸引力是巨大的,班主任的吸引力也是巨大的,我们班有差不多10个人报名了。

         第一次的培训是在五一放假的某一天,同宿舍还有两个报名的MM都回家了。我就一个人坐车到了培训地点东五楼,校车师傅并没有把我载到东五,在几个路口前就让我下了,那天还是下着雨,可怜的我走到东五时鞋子全湿了。第一次培训的内容是互联网基础知识扫盲+HTML简介,记得班主任的PPT还是英文的,很是崇拜…课上班主任还演示了HTML的一些基本使用,感到很神奇…

         再之后还有什么活动也记不清了,然后就是暑假的集训了。暑假集训的主要目的是为了重做系网站,系网站是几年前的几位学长做的,班主任对那么那个网站很不满意,说代码写得很不好看,也很不好维护。肩负着这样一个光荣的重做EI系网站的任务,我们这一群人,就浩浩荡荡的留在了学校里。同宿舍的两人一个回家一个社会实践,又是只有我一个人留下了。

         于是乎,每天早上8点半左右,我就骑着我的小自行车,大义凛然地顶着毒辣辣的太阳奔向南一楼(我们网络部成员学习的地方)。那个时候还比较“嫩”,不知道打遮阳伞,也不知道擦防晒霜,估计晒黑了不少。网络部在南一楼的学习地点其实也就是一个十二平米左右的小房间,是我们系一位辅导员的办公室。就那么一个十二平米的小房间,我们大概塞了10个人在里面。每个人的活动区域都很小,也就能前后转个身而已。 MORE…