April 2014 Blog Posts

Linux普通用户无法使用sudo处理及sudoers设置

MitchellChu 2014-04-29 Unix & Linux

下我们经常使用的SSH远程连接到系统进行操作,而为了安全,一般使用的是非root用户连接,只有在必要的时候,我们才会使用sudo切换到root帐户下进行操作,以保证系统尽可能的安全和不被损坏。然而,在有的时候我们通过普通用户SSH连接到Linux的时候,使用sudo来执行身份切换的时候,系统会报错(以下是CentOS6.4下的报错):

对不起,用户 yourusername 不能在 CentOS 上运行 sudo。

## 如果直接运行命令sudo command,则是如下错误

yourusername 不在 sudoers 文件中。此事将被报告。

或者

Sorry,user yourusername may not run sudo on CentOS

或者(直接sudo+命令):

yourusername is not in the sudoers file. This incident will be reported.

这种情况下,为了让我们的用户能够正常的使用,需要通过修改/etc/sudoers文件。

#添加下面一行到:/etc/sudoers,即可让该用户使用sudo
yourusername ALL=(ALL) ALL

这种修改是将所有的权限都赋值给了yourusername,为了sudo这个命令,就这么ALL几下,似乎有点不负责任啊,有木有?

文件默认是只读的,因此不能直接修改。网上很多方法是使用chmod来修改sudoers的权限后再通过编辑器(vi/vim etc.)来修改sudoers内容,之后再将sudoers文件的权限恢复,来达到修改sudoers的目的。这种方法确实能够修改sudoers,但是却没有办法保证sudoers文件的正确性,如果修改出现错误,将导致sudoers(sudo)不能正常的工作。更正确的做法是直接使用sudoers的专用编辑器:visudo来编辑sudoers文件。

# visudo

## visudo默认的编辑器是vi,如果你需要修改你的默认编辑器,可以通过添加EDITOR="" 来修改。

# EDITOR="/usr/bin/vim -p -X" visudo

## 如果要永久改变默认编辑器,只要将EDITOR设置为环境变量

# export EDITOR="/usr/bin/vim -p -X" 

 使用visudo来编辑sudoers的好处是:当我们完成sudoers的编辑时,系统会自动检测我们sudoers的格式是否正确,从而保证sudoers文件的正确性。

 其实,sudoers文件是非常简单的,其内容只包含两种,第一种是别名(Aliases,基本变量定义),第二种是用户规范描述(user specifications,指定某用户可以运行的内容)。而这两种内容都是通过扩展巴科斯范式(EBNF)1来进行定义。一旦定义了别名,在用户说明中,就可以使用别名来简化给用户定义运行内容。如果同一个用户在sudoers文件中能够找到多条说明,那么将使用找到的最后一条。

sudoers的别名包含四种:User_Alias,Runas_Alias,Host_Alias和Cmnd_Alias。

User_Alias是用户别名,这个和系统中的group有点类似。通过用户别名,在sudoers中,可以将一个或者多个用户用别名来替代。

## 定义一个用户别名
User_Alias OPERATORS = operator1,operator2,remote_admin

注意:
1. 等号后面的都是系统中的用户名,用户ID,组,组id等组成,多个用逗号分隔,具体信息可参看文后参考内容sudoers2
2. 别名只能是大写字母开头的,并由大写字母,下划线和数字组成的字符串

Runas_Alias和User_Alias类似,但不同的是Runas_Alias指明的是用户将要运行命令的身份。Runas_Alias可以包含Runas_Alias别名(User_Alias是包含User_Alias别名)。

同时要注意的是,上面两个别名在匹配的时候使用的是字符串匹配法则,也就是说,当两个不同用户名的用户,即使使用了同一个用户ID,在实际情况下,也会被认为是不同的。要避免这种情况,可以考虑使用用户的ID来替代用户名。如:

Runas_Alias ROOT = #0
## 所有的用户ID为0的,统归为ROOT别名

Host_Alias是主机别名,指定规则适用的主机列表。

Host_Alias SERVERS = 192.168.0.1, 192.168.0.2, server1

注意:

1. Host_Alias中,只能使用真实的地址,这就意味着127.0.0.1这种地址是永远不会被匹配到的。而localhost要只有在真有主机的主机名为localhost的时候才能被匹配。

2. 如果IP地址没有给定掩码,sudo自动会搜寻本地网卡上对应匹配的掩码地址来作为默认的网络掩码。

Cmnd_Alias是命令别名,指定用户能够运行的某一类命令的列表。可包含一个,或多个命令(带参数),目录,或者其他的命令别名。

Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt
##所有的关机命令
Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo
## 所有的用户管理命令

注意:

1. 命令列表中如果包含目录(以/结束),那么该目录下(不含子目录)的所有可执行文件都被赋予了执行权限,这和使用通配符*类似;

2. 命令列表中务必使用全路径名,如果不使用完全限定名,将意味着恶意用户可以创建同名文件并在切换后的用户下运行,这将给系统带来未知的安全风险;

3. 当命令列表中的命令需要带参数的时候,如果出现特殊字符(',',':','=','\'),将需要使用反斜杆('\')进行转义。

通过上面四种别名,我们能够定义出特定的用户,主机和命令列表,在实际运行中,我们如果要对这些特定的列表的某些运行时配置项3进行修改,我们可以通过Default来完成。

Default对于前面四种别名的限制格式各有不同,定义如下:

## EBNF
Default_Entry ::= ('Defaults' |'Default' '@' Host_List |'Default' ':' User_List | 'Default' '!' Cmnd_List | 'Default' '>' Runas_List ) Parameter_List

Parameter_List ::= (Parameter '=' Value |Parameter '+=' Value |Parameter '-=' Value |'!'* Parameter)[ , Parameter_List]

定义中 *_List可以是别名也可以是特定的具体信息(如:用户名)。

别名之后,就是具体的用户规范描述(User Specification)了。

User Specification表述的主要意义就是:哪些用户在哪些环境里可以作为哪些用户来运行哪些程序。用EBNF来表示这个定义如下:

User_Spec ::= User_List Host_List '=' (Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List) \
        (':' Host_List '=' Cmnd_Spec_List)*

Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd
 
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
 
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
 
Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
 
Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
              'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |
              'LOG_OUTPUT:' | 'NOLOG_OUTPUT:')

看起来很复杂,来个栗子也许会好很多:

## 在SERVERS环境中OPERATORS可以以ROOT角色运行SHUTDOWN_CMDS
OPERATORS SERVERS = (ROOT) SHUTDOWN_CMDS

## 在所有的环境中yourusername都可以切换到所有账户下运行所有的命令
yourusername ALL = (ALL) ALL

## yourusername用户在SERVERS上面执行关机操作
yourusername SERVERS = /sbin/halt, /sbin/poweroff

## 以root来执行关机操作,但以operator来执行kill命令
yourusername SERVERS = (root) SHUTDOWN_CMDS, (operator) /bin/kill
## sudo -u来选择用户

## 仅以operator组来执行kill命令
yourusername SERVERS = (:operator) /bin/kill
## 注意,在sudo的时候需要使用-g配合,但kill还是由yourusername执行

## 无需使用密码(不用校验operator身份),即可以operator身份来执行kill命令
yourusername SERVERS = (operator) NOPASSWD: /bin/kill

至于SELinux_Spec和Solaris_Priv_Spec一般不会用到,SELinux_Spec是在支持SELinux的系统中有效,而Solaris_Priv_Spce则是针对Solaris系统的配置。Tag_Spec相对前两个在Linux系统来说就实用的多,Tag_Spec共有10个可选tag参数,可以分成5组,每组由互斥的两个tag参数构成,分别是:NOPASSWD和PASSWD,NOEXEC和EXEC,SETENV和NOSETENV,LOG_INPUT和NOLOG_INPUT,LOG_OUTPUT和NOLOG_OUTPUT。不同组别的tag参数可以同时使用,在使用Tag_Spec之后,如果没有使用相反的tag参数覆盖,则同行后面的命令将会继承tag参数设置。下面是5组tag的说明:

Tag参数 作用描述
NOPASSWD,PASSWD 标识是否需要身份验证
NOEXEC,EXEC 是否限制程序进一步运行命令(动态链接有效)
SETENV,NOSETENV 标志如何处理环境变量,建议不用SETENV(默认是NOSETENV),SETENV会禁用通过命令行传递的env_reset参数
LOG_INPUT,NOLOG_INPUT 输入日志开启标志,LOG_INPUT开启后,所有输入信息都会被记录,如密码这类敏感信息同样会以明文形式记录下来
LOG_OUTPUT,NOLOG_OUTPUT 输出日志标志,开启后,所有的输出都会被保存在文件中

 到此为止,sudoers文件的主体就已经完成了,根据这些东西,你就可以顺利修改sudoers了。

高级部分:

1. 可以通过#includedir,#include两中方式将其他的sudoers文件包含进来;

2. 要注释,用#,当然,第一点中的这个和#后面跟数字的要小心(猜猜看,是神码?);

3. 在编辑中,为了简便,你可以在主机列表,路径名称和命令列表中使用通配符(不是正则),通配符:*(匹配0或多个),?(匹配单个字符),[...](匹配范围内的任一字符),[!...](说了不是正则了,匹配任一不在指定范围内的字符),\x(转义特殊字符,如:*,?, [, ])。例外:""双引号在命令行参数中表示的是命令不允许带任何参数;传递给sudoedit内置命令的命令行参数必须包含路径名称,因此斜杆(/)不会被通配符匹配;

4. 在Alias,Defaulsts,User Specification中设定值的时候可以使用感叹号(!),表示取非(排除),当然,如果你觉得多几个感叹号能加强效果也是可以的,记住单数表示取反,偶数是双重否定,直接抵消作用即可。同时也要注意,这个感叹号有时候会失效,会带来一些安全风险;

5. 上一点的一点特例:

## 可Runas除了root之外的所有用户
User_Alias SPECIALUSERS = ALL,!root

## 这个的作用不同于上面这行规则,sudo匹配的时候是不匹配root
## 同时也不会匹配任何其他用户
User_Alias SPECIALUSERS = !root

6. 规则太长,一行写不下?试试行尾加上反斜杆(\),然后换到第二行继续写。

7. MitchellChu本身也是菜鸟一枚,共勉! (这个最高级:P)

 

最后回归开篇第一个问题,你觉得这种配置有问题么?

 

 参考:

1. 扩展巴科斯范式(EBNF):Extended Backus-Naur FormBackus-Naur Form, 巴科斯范式扩展巴科斯范式

2. sudoers:Sudoers Manual

3. Sudoers的Default可配置参数请参看2中Sudoers Manual中的SUDOERS OPTIONS

4.其他一些参考:Archlinux SUDO, Ubuntu Sudoers, sudo.ws SUDO manual

CentOS(Linux)下编译安装Redis注意事项

MitchellChu 2014-04-28 Unix & Linux

下编译安装Redis(V2.8.7)之后,总结的注意事项如下:

下载安装

$ wget http://download.redis.io/releases/redis-2.8.7.tar.gz
$ tar xzf redis-2.8.7.tar.gz
$ cd redis-2.8.7
$ make

TIPS: 可先到官网下载Redis文件,同时可以查看官网的传送门)。

  1. 在Redis根目录下,直接make
  2. make成功后,如果需要make test,则需要配置TCL8.5/TCL8.6来进行测试
  3. TCL8.6非默认安装的时候(偏低),一定要在PATH的路径中创建文件连接到tclsh8.6,同时注意,文件名称必须是tclsh8.5/tclsh8.6,因为在make test的时候,会使用which查找8.5或者8.6版本的tcl
  4. 安装:直接make install,默认安装在/usr/local/bin下,如果需要设置自定义路径,用make PREFIX=/usr/local/redis install来安装
  5. 安装后,默认是没有配置文件的,需要配置的话,在安装成功后可以使用utils里面的install_server.sh来配置服务器.
       install_server.sh里面有很多bug,如果不修改你将会发现/etc/init.d/redis_***是无法正常使用的——里面的配置文件有很多\n,未被转义.
         line 163,177: if [ !`which chkconfig` ]; then 中 !应该和`which chkconfig`之间有个空格没有出现
         line 165: echo 之后应该需要一个-e参数,表示允许使用转义字符.
  6. 配置:
    1. 为了防止内存爆满导致系统崩溃,需要设置/etc/redis/*.cnf中的maxmemory
    2. 防止报错,可以调整内存分配策略
      /etc/sysctl.conf 这个是Redis日志中可以看到的建议:
         添加vm.overcommit_memory=1保存,并执行:sysctl vm.overcommit_memory=1使之生效
      
      /proc/sys/vm/overcommit_memory,这个里面就是overcommit_memory值,这个可以被上面的设置更新.
          0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
          1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
          2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

在完成之后,可以开启Redis,测试下是否正常。

下面测试了给testkey赋值为value:

$ redis-cli
127.0.0.1:6379>set testkey value
OK
127.0.0.1:6379>get testkey
"value"
127.0.0.1:6379>exit
$

CentOS下编译安装MySQL5.6.16备忘

MitchellChu 2014-04-28 Unix & Linux

下编译MySQL5.6.16版本,直接编译MySQL源代码会出现一些问题,因此在这里备忘一下编译方法及修改事项。的编译过程如下:

$ sed -i "/ADD_SUBDIRECTORY(sql\/share)/d" CMakeLists.txt &&
$ sed -i "s/ADD_SUBDIRECTORY(libmysql)/&\\nADD_SUBDIRECTORY(sql\/share)/" CMakeLists.txt &&
$ sed -i "s@data/test@\${INSTALL_MYSQLSHAREDIR}@g" sql/CMakeLists.txt &&
$ sed -i "s@data/mysql@\${INSTALL_MYSQLTESTDIR}@g" sql/CMakeLists.txt &&
$ sed -i "s/srv_buf_size/srv_sort_buf_size/" storage/innobase/row/row0log.cc &&
$ mkdir build &&
$ cd build &&
$ cmake -DCMAKE_BUILD_TYPE=Release                    \
         -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.16                   \
         -DINSTALL_MYSQLDATADIR=/srv/mysql             \
         -DINSTALL_SQLBENCHDIR=share/mysql/bench       \
         -DINSTALL_SUPPORTFILESDIR=share/mysql         \
         -DMYSQL_DATADIR=/srv/mysql                    \
         -DSYSCONFDIR=/etc/mysql                       \
         -DWITH_PERFSCHEMA_STORAGE_ENGINE=OFF          \
         -DWITH_EXTRA_CHARSETS=all                 \
         -DWITH_LIBEVENT=system                        \
         -DWITH_SSL=system                             \
         .. &&
make

TIPS:如果你对参数的设置不是很清楚,可以参看MySQL的官方文档: MySQL Source-Configuration Options

要是你能顺利完成编译,那恭喜。

Mitchell前后做过的修改和操作如下:

  1. 修改: ./cmake/ssl.cmake 237:55
    在"${WITH_SSL_DOC}的错误,修改成" ${WITH_SSL_DOC}
    注意:双引号后面需要加个空格
  2. 修改./CMakeLists.txt
    CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
    # Avoid warnings in higher versions
    if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" GREATER 2.6)
       CMAKE_POLICY(VERSION 2.8)
       # Added by MitchellChu to dispose CMP0022 CMake Waning.
       # 这里检验cmake版本是否大于2.8.11,如果大于,把CMP002策略设置为OLD
       IF("${CMAKE_VERSION}" VERSION_GREATER "2.8.11")
          CMAKE_POLICY(SET CMP0022 OLD)
       ENDIF()
    endif()
  3. 安装完毕添加my.cnf
    # install -v -dm 755 /etc/mysql &&
    cat > /etc/mysql/my.cnf <<"EOF"
    ###这里是你的cnf配置文件内容
    EOF
  4. 初始化Mysql实例数据
    # /usr/local/mysql5.6.16/scripts/mysql_install_db --basedir=/usr/local/mysql5.6.16 --datadir=/srv/mysql/data --user=mysql&&
    chown -R mysql:srvuser /srv/mysql/data
  5. MYSQL_UNIX_ADDR为默认的/tmp/mysqld.sock,还要配置下运行时的mysqld.sock和mysql.sock
    # install -v -o mysql -g srvuser -d /var/run/mysqld &&
    # install -v -o mysql -g srvuser -d /var/lib/mysql
    
    ## 网上说法是要touch pid文件
    
    # touch /var/run/mysqld/mysqld.pid
    ## 其实不必,如果my.cnf设置pid-file则需要对应的路径下有权限,如果没有设置,默认在datadir下,pid文件名为:hostname.pid, (hostname为运行系统的名称)
    ## 建立mysql client的socket,编译默认在/tmp/mysql.sock,而系统mysqld默认是在/var/run/mysqld/下面建立mysqld.sock的(可在my.cnf中配置)
    
    # ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
    ## 如果是在my.cnf中配置了client 和mysqld的 socket,直接指向同一个mysqld.sock的话(比如指向/tmp/mysqld.sock),则可以不必在建立连接。
  6. 配置好了之后,可以测试启动,使用mysqld_safe启动.
    # ./mysqld_safe --user=mysql >/dev/null 2>&1 &
  7. 如果正常,则可以使用 mysqladmin设置一个本地密码:
    # ./mysqladmin -u root password <your-password-here>
  8. 而后,关闭mysql,进行后继配置
  9. 配置服务,其实很简单,找到文件mysql.server,并拷贝到/etc/init.d/下即可
    # cp /usr/local/mysql5.6.16/share/mysql/mysql.server /etc/init.d/mysql.server
    ## 如果你对启动项有修改,可以在这里面修改,比如我的datadir编译和初始化的时候不同,则可以在此修改datadir的值
    ## 完成这步之后,你可以使用:
    ## 启动mysql
    # service mysql.server start 
    ## 停止mysql
    # service mysql.server stop
    ## 重启mysql
    # service mysql.server restart
  10. 设置启动运行和关机自动关闭mysql
    ## 这个仅需要建立两个连接即可,开机运行:
    # ln -s /etc/init.d/mysql.server /etc/rc3.d/S99mysql
    # ln -s /etc/init.d/mysql.server /etc/rc0.d/K01mysql

 完毕之后,启动MySQL服务,此时已经完成MySQL的编译安装的所有工作,接下来要做的是,使用root登录MySQL创建你需要的用户和库(表)。

注意:

$,#是终端提示符,##是注释

本文仅是Mitchell本人在CentOS()下编译安装MySQL5.6.16时的个人备忘,参考是可以,权威是没有的。

CentOS6.4下Emacs24.3的编译安装备忘

MitchellChu 2014-04-27 Unix & Linux

Emacs是一个具有强大扩展性的文本编辑器(说IDE或许更准确点),在中,你可以直接通过yum来安装。出于对新版本的热衷,选择了对Emacs24.3进行了编译安装。以下是Mitchell的安装过程,关于编译安装的一些介绍可以参看前一篇编译安装介绍

首先,自然是要获取到Emacs的源代码,源代码在Emacs的官方网站上可以找到下载的地方(其中一个地址);第二个就是依赖了,版本需要依赖autoconf(2.65或更新),makeinfo(4.7或更新),makeinfo在Texinfo里面。

编译过程是反向的,先将依赖,完成之后,再编译安装Emacs本身。

autoconf的编译安装,由于CentOS本身自带autoconf,但是autoconf的版本不符合要求,因此先删除自带的autoconf。

yum erase autoconf

用这种方法移除后在更新,涉及到依赖包:automake,intltool,libtool。我们还需要将这些新版本安装回来。安装automake,intltool,libtool的过程简要备录如下:

automake安装:

$ wget http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.xz
$ ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.14.1
$ make
$ sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh
$ make -j4 check

TIPS:这个后缀的文件名不太常见,解压方法可以参考:Linux下的压缩解压命令汇总

make check的信息如下:

   ============================================================================
   Testsuite summary for GNU Automake 1.14.1
   ============================================================================
   # TOTAL: 2761
   # PASS:  2455
   # SKIP:  266
   # XFAIL: 40
   # FAIL:  0
   # XPASS: 0
   # ERROR: 0
   ============================================================================

这表示成功,可以安装

# make install

libtool安装:

$ wget http://mirror.hust.edu.cn/gnu/libtool/libtool-2.4.tar.xz
$ wget http://mirror.hust.edu.cn/gnu/libtool/libtool-2.4.tar.xz.sig

$ tar xvf libtool-2.4.tar.xz
$ cd libtool-2.4/
$ ./configure --prefix=/usr
$ make
$ make check

# make install

intltool安装:

$ wget http://launchpad.net/intltool/trunk/0.50.2/+download/intltool-0.50.2.tar.gz
$ ./configure --prefix=/usr &&
$ make

# make install &&
   install -v -m644 -D doc/I18N-HOWTO \
   /usr/share/doc/intltool-0.50.2/I18N-HOWTO

makeinfo(Texinfo5.2)安装类似,这里只给出下载地址:

$ wget http://ftp.gnu.org/gnu/texinfo/texinfo-5.2.tar.xz

Emacs24.3编译安装:

$ wget http://mirror.hust.edu.cn/gnu/emacs/emacs-24.3.tar.gz
$ wget http://mirror.hust.edu.cn/gnu/emacs/emacs-24.3.tar.gz.sig
$ ./configure --prefix=/usr         \
               --with-gif=no &&
  make bootstrap

# make install &&
  chown -v -R root:root /usr/share/emacs/24.3

TIPS:这里下载了签名文件,你可以通过签名文件来验证程序的合法性,具体验证方法你可以参照Linux下校验下载文件的完整性

Emacs配置中的更多参数可以查看文档,--prefix是Emacs程序的安装路径,--with-gif=no在libungif没有安装的情况下必须设定的。

安装完成后,我们能在安装目录找到emacs,ctags,ebrowse,emacsclient,etags,grepchangelog和rcs-checkin程序。

至此,Emacs就算安装完成,你可以运行emacs试试。

 TIPS:

代码段中$前缀表示为可以在非root账户下进行;#表示在root账户下进行。

CentOS/Linux下软件的编译安装介绍及注意事项

MitchellChu 2014-04-26 Unix & Linux

CentOS作为服务器,要求软件的稳定性比较高,因此发布的软件一般都比较老,然而,有的时候我们需要某些软件新的功能,这种时候如果没有可用的安装包,就需要使用软件提供的源代码,在下进行编译安装。编译安装顾名思义就是需要先进行对软件的源代码进行编译,然后安装编译之后的软件文件。在CentOS/下编译软件的源代码,一般会涉及编译器,关联库等。

编译器:

在CentOS下开发软件的语言种类繁多,需要根据需要编译的软件的源代码选择对应的编译器。在CentOS下,最常用的有两种:C语言的可以使用gcc,C++可以使用g++。GCC(GNU Compiler Collection,GNU编译器套件)已经扩展成可以处理C,C++,Ada,Java,Objective-C,Object-C++,Go,Fortran的编译器。也就是说,一般情况下,在拥有gcc编译器的前提下,CentOS下你已经可以编译大部分应用程序。如果你仅仅需要编译程序,通过yum install 来安装gcc和g++吧。—— 当然,一般仅有这两个编译器是远远不够的。

关联库:

前面说了,有了对应的编译器,理论上是可以完成对软件的编译。然而,在CentOS/Linux下,大部分的软件都有对其他库的依赖,这就需要在编译的时候,将关联的库包含进来,才能顺利的完成软件的编译。哪怕是同一个库,在不同的软件编译中,可能依赖的版本也会有所不同,因此,在实际编译的过程需要谨慎选择依赖库的版本。关联库可以通过编译器的参数来进行设置。

编译工具:

关联的库可以通过来进行添加,但这种方法一旦在软件依赖比较多;需要根据系统环境进行参数筛选依赖库的时候,编译者为了要顺利在某一个特定的Linux发行版本下编译成功软件,就需要对该软件在当前Linux版本下的相关信息了解清楚。在繁多的软件编译安装列表中,要对每一个软件在每一个版本的Linux/CentOS下的安装信息都掌握,对编译者的要求就非常高了,无形之中会加重软件的编译安装成本,为了应对这种情况,Linux下提供了configure,make,CMake,automake等,这可以让软件的发布者提前将特定版本下编译的信息通过配置文件的形式提前固定下来。编译的时候,直接读取配置文件中的信息,找到对应的配置项,进行配置校验即可。要了解更多可以了解下MakeFile的相关信息。

系统编译相关:

1. 在CentOS中,如果要进行对软件的编译安装,我们一般需要安装:Development Tools

yum groupinstall "Development Tools"

如果你的软件需要图形界面的话,你可能还需要安装X Software Development

yum groupinstall "X Software Development"

要是你编译安装的软件比较旧,那可能就还需要Legacy Software Development了

yum groupinstall "Legacy Software Development"

可以根据自己的实际情况对上面的开发环境进行配置,Mitchell一般在CentOS上只编译最新的,无图形界面的软件,这种情况下,Development Tools对我来说已经就足够了。

如果没有安装Development Tools,而只安装gcc,g++这类的编译器,在实际编译的时候,你将会发现编译工作进展是痛苦无比的,这是因为,你只安装了特定的编译器,而关联的库文件缺失。在编译自己的小程序也许没有问题,但涉及到库关联的时候,问题就来了。

2. 关于系统时间,开始Mitchell本人一直觉得,系统时间和编译是半毛钱没有的事情,然而在一次编译的过程中发现(特别是在使用虚拟机的时候,时间观念淡薄啊),./configure出来的makefile,一直会报错:

MakeFile is too old.

 这个时候,不要吝惜那分分钟的时间,赶紧先把系统时间修改成正确的时间吧(时区)。

更新系统时间:

date 'current-date'

更新硬件时间:

#使用hwclock
hwclock -w
#使用clock
clock -w

3. 安装路径,一般使用--prefix来进行设置,这样便于将来维护。 

 

Linux现在还是菜鸟一枚,暂时只想到这么些,如果还有更多或不对的地方,欢迎指正补充。

Linux下常用压缩及解压命令

MitchellChu 2014-04-03 Unix & Linux

下,压缩和解压相比较Windows而言,琳琅满目的各种是一种莫名的负担,很多时候,根本就不知道该如何下手,经过无数次的折磨之后,通过伟大的互联网整理出了下面这份常用压缩包的后缀名的和压缩方法以及可能涉及到的相关程序.虽然不一定完全正确,且用且更新罢!

文件后缀 解压/解包 压缩/打包 备注
*.tar tar xvf file.tar tar cvf file.tar srcDir tar
*.gz gunzip file.gz
gzip -d file.gz
gzip file gzip
*.tar.gz
*.tgz

tar zxvf file.tar.gz
tar zxvf file.tgz

tar zcvf file.tar.gz srcDir tar & gunzip
*.bz2 bzip2 -d file.bz2
bunzip2 file.bz2
bzip2 -z file-or-dir bzip2
*.tar.bz2 tar jxvf file.tar.bz2 tar jcvf file.tar.bz2 srcDir bzip2
*.bz bzip2 -d file.bz
bunzip2 file.bz
bzip2自动创建bz2格式文件,无法创建bz格式 bzip2
*.tar.bz tar jxvf file.tar.bz 同上 bzip2
*.Z uncompress file.Z compress file-or-dir compress
*.tar.Z tar Zxvf file.tar.Z tar Zcvf file.tar.Z fileOrDir compress
*.tar.xz xz -d file.tar.xz
tar -xvf file.tar (两条命令一起)
或者
tar -Jxvf file.tar.xz

tar -cvf file.tar fileOrDir
xz -z file.tar

tar -Jcvf file.tar.xz fileOrDir

xz
*.lzma lzma -d file.lzma
unlzma file.lzma
lzma fileOrDir lzma
*.tar.lzma lzma -dkf file.tar.lzma lzma -kf file.tar lzma
*.zip unzip file.zip zip file.zip fileOrDir zip
*.7z 7za x file.7z 7za a file.7z fileOrDir 7zip
*.rar rar x file.rar rar a file.rar fileOrDir rar/unrar, unrar不能创建压缩包
*.lha lha -e file.lha lha -a file.lha fileOrDir  
*.rpm rpm2cpio file.rpm | cpio -div    
*.deb ar p file.deb file.tar.gz|tar zxf -    

*.tar
*.tgz
*.tar.gz
*.tar.Z
*.tar.bz
*.tar.bz2
*.zip
*.cpio
*.rpm
*.deb
*.slp
*.arj
*.rar
*.ace
*.lha
*.lzh
*.lzx
*.lzs
*.arc
*.sda
*.sfx
*.lnx
*.zoo
*.cab
*.kar
*.cpt
*.pit
*.sit
*.sea.tar
*.tgz
*.tar.gz
*.tar.Z
*.tar.bz
*.tar.bz2
*.zip
*.cpio
*.rpm
*.deb
*.slp
*.arj
*.rar
*.ace
*.lha
*.lzh
*.lzx
*.lzs
*.arc
*.sda
*.sfx
*.lnx
*.zoo
*.cab
*.kar
*.cpt
*.pit
*.sit
*.sea

sEx x file.* sEx a file.* fileOrDir sEx本身没有实际功能,只是根据文件名后缀调用对应的程序完成相应功能,具体的后缀名需要的程序还需要另外安装。

参考文章:

  1. Tar online document
  2. Compressing files under Linux or UNIX cheat sheet
  3. LZIP
  4. Z:simple tar &feathering
  5. XZ
  6. 神奇的Google:Linux 压缩解压

Linux下chkconfig命令的作用

MitchellChu 2014-04-03 Unix & Linux

chkconfig在下是管理服务/启动项在各个中的设置,在Linux中系统有7个运行级别,分别是:

  1. 运行级别0:表示关机
  2. 运行级别1:表示单用户模式
  3. 运行级别2:无网络连接的多用户命令行模式
  4. 运行级别3:有网络连接的多用户命令行模式
  5. 运行级别4:暂不可用
  6. 运行级别5:带图形界面的联网多用户模式
  7. 运行级别6:重新启动

能够管理全部云心级别,但是默认情况下,只对级别2,3,4,5这4个级别进行操作。如果要操作其他级别的,需要带上--level参数。chkconfig一般常用的组合如下:

用法:   chkconfig [--list] [--type <type>] [name]
         chkconfig --add <name>
         chkconfig --del <name>
         chkconfig --override <name>
         chkconfig [--level <levels>] [--type <type>] <name> <on|off|reset|resetpriorities>
#列出系统所有的服务设置详情
#注意:如果是手动设置的不能显示
chkconfig --list

#列出某个服务在各个级别中的启动设置项
# servicename可以是:mysqld,vsftpd等
chkconfig --list servicename

#设置某个服务在某些级别的启动设置
#这里以vsftpd为例,设置在2,3运行级别下启动
chkconfig --level 2,3 vsftpd on

#增加服务
#假设要增加的名称为:serv-name
chkconfig --add serv-name

#在上面添加后,你就可以使用前面的方法来设置serv-name的在各个运行级别的启动
#如果是手动配置的时候,会配置/etc/rc.d/rc*.d中K/S项
#rc*为各个级别名称,但手动配置的,使用chkconfig是无法管理的.

#删除服务
chkconfig --del serv-name

 

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。