工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表2010年11月的文章

linux 下制作二进制 .bin 的文件

制做方法是使用cat 命令将执行脚本和打包文件同时放到一个.bin的文件里
这样安装的时候只要使用一个包,直接执行该包即可安装完毕,简单方便。
例:制作安装apache、mysql的安装脚本包
1.将源码包先打包
#tar zcvf packages.tar.gz httpd-2.0.63.tar.bz2 mysql-5.0.33.tar.gz

2.编写脚本如下:
# cat install.sh
#!/bin/bash
dir_tmp=/root/installapache
mkdir $dir_tmp
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null
cd $dir_tmp
tar zxf packages.tar.gz
tar jxf httpd-2.0.63.tar.bz2
cd  httpd-2.0.63
./configure --prefix=/tmp/apache2
make
make install
cd $dir_tmp
tar zxf mysql-5.0.33.tar.gz
cd mysql-5.0.33
./configure --with-charset=gbk --with-extra-charsets=binary,latin1,gb2312 --localstatedir=/home/db --with-mysqld-ldflags=-all-static -enable-assembler --with-innodb --prefix=/tmp/mysql5
make
make install
exit 0


#cat install.sh packages.tar.gz >install.bin

这样就生成install.bin的安装文件,改文件是由shell脚本和二进制合成的。前半部分是脚本后半部分是二进制文件,用strings等二进制查看命令可以看到
最主要的是下面这句,是将二进制文件从.bin文件里分离出来
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/packages.tar.gz" 2>/dev/null

安装的时候直接执行
sh install.bin
安装这个方法可以将我们平时常使用的安装脚本化,然后打包。以后使用就方便了。

xen hypervm

虽说hypervm在年中的时候由于安全漏洞引起了轩然大波,但做为免费的VPS管理工具,还是很方便的。自己注意一些安全配置,也应该无大障。另外,目前hypervm已经开源,相信未来会更光明的。

hypervm的安装还是很简单的,下面是官方的命令说明:

 

  • $ setenforce 0
  • $ wget http://download.lxcenter.org/download/hypervm/production/hypervm-install-master.sh
  • $ sh ./hypervm-install-master.sh –virtualization-type=xen/openvz/NONE
  • You have to explicitly specify which virtualization type you want using the option –virtualization-type as either xen or openvz or NONE. If you want to install hypervm on an existing system, just use virtualization-type=NONE, which will install just hyperVM components, and skip the virtualization componetns entirely. When you run the command, you will presented with a menu from up2date, on which you can press <Enter>
    值的一提的是,hypervm安装时会下载一些的操作系统的安装模板,下载时间会比较长,如果暂时不需要这些模板,可以通过在安装命令行加入skip-ostemplate参数。比如:

    # sh ./hypervm-install-master.sh –virtualization-type=openvz –skip-ostemplate=true

     

    --------------------------------------

    HyperVM安装手记(XEN篇)

    http://download.lxlabs.com/?software=hypervm选择下载需要的安装脚本(master的地址为http://download.lxlabs.com/download/hypervm/production/hypervm-install-master.sh),在服务器上运行sh ./hypervm-install-master.sh –virtualization-type=xen
    安装过程是会自动完成的,但在这之前,需要先将需要的虚拟化软件装好。安装完HyperVM后init 6重启,然后通过浏览器访问http://<server address>:8888就能操作虚拟机了。
    需要注意的是,HyperVM需要一个未建立分区的LVM卷来存放XEN虚拟机,并且这个操作要在安装HyperVM之前完成,虽然可以在安装后通过管理界面添加,但那比较麻烦。
    对于fedora 6/centos 5,其xen安装可能会有些后遗症,因此,在这些系统中安装完HyperVM后应根据http://lxlabs.com/software/hypervm/install-xen/中的方法对系统进行一些调整。
    推荐一个建立LVM卷的方法:http://book.51cto.com/art/200909/149041.htm

    ---------------------------------------

    HyperVM安装手记(OpenVZ篇)

    首先要说一说OpenVZ的安装
    cd /etc/yum.repos.d
    wget http://download.openvz.org/openvz.repo
    yum install ovzkernel

    即可完成安装。重启后,从
    http://download.lxlabs.com/?software=hypervm选择下载需要的安装脚本(master的地址为http://download.lxlabs.com/download/hypervm/production/hypervm-install-master.sh),在服务器上运行sh ./hypervm-install-master.sh –-virtualization-type=openvz
    安装过程是会自动完成的,安装完HyperVM后init 6重启,然后通过浏览器访问http://<server address>:8888就能操作虚拟机了。

    最后,推荐个关于OpenVZ安装的页面http://linux.chinaunix.net/docs/2006-11-13/3187.shtml

    shell的字符替换

    变量替换:
    一:简单赋值和替换
    a=bcd
    $ echo $a  
    bcd
    $ echo ${a}
    bcd

    二:变量扩充
    除了shell中的meta,其它的[^a-zA-Z0-9_]几乎都可以作单词边界。
    同sed中关于单词边界[^a-zA-Z0-9_]的描述。
    http://bbs.chinaunix.net/forum/24/20040825/393964.html
    这些功能有时候会在程序中有意想不到的作用!
    例如:
    $ a=bcd
    $ echo ${a}.b
    bcd.b
    $ echo $a.php
    bcd.php
    $ echo $a%b
    bcd%b
    $ echo /$a/bc
    /bcd/bc
    对于shell中的meta字符,则backslash。
    $ echo $a\*b
    bcd*b

    三:变量中的变量
    $ a=bcd
    $ b=efg
    $ c=$a$b
    $ echo $c
    bcdefg
    $ d=$c.ghi
    $ echo $d
    bcdefg.ghi

    思考:若变量互相嵌套,会怎样呢?

    四:变量的特异功能
    到网中人的啦!(ps:重写真是没激情啊)
    file=/dir1/dir2/dir3/my.file.txt
    我们可以用 ${ } 分别替换获得不同的值:
    ${file#*/}:从变量file的字符串左边开始,删除字符直到第一个“/”:dir1/dir2/dir3/my.file.txt
    ${file##*/}:从变量file的字符串左边开始,删除字符直到最后一个“/”:my.file.txt
    ${file#*.}:从变量file的字符串左边开始,删除字符直到第一个“.”:file.txt
    ${file##*.}:从变量file的字符串左边开始,删除字符直到最后一个“.”:txt

    其实,在“#”后面,无非就是一个匹配问题,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”,例如:
    $ echo ${file#????}
    1/dir2/dir3/my.file.txt
    $ echo ${file#*[0-9]}
    /dir2/dir3/my.file.txt
    $ echo ${file#/dir1/dir[0-9]}
    /dir3/my.file.txt

    “#”:相当于最小匹配,遇到一个最小的符合其后表达式的字符串(单个或多个)即中止匹配动作;
    “##”:相当于最大匹配,它尽可能的匹配更多的字符。
    我们可以拿“*”来说明:  
    *  在shell中表示匹配任何符号包括空。当它在只有一个 # 的变量替换中,受最小匹配的影响,它不会匹配任何可打印字符,只匹配一个空,也就是什么也不匹配,你完全可以忽略它的存在;
    当在有两个 ## 的变量替换中,受最大匹配的影响,一个 * 表示匹配整个字符串。
    如果想匹配字符“*”时,要在“*”前加一个“\”,其后的“*”失去通配符的功能。
    但是还有一种例外情况(请接着看)


    例:
    $ file2=abcd.efgh.ijkl.oopp
    $ echo ${file2#*.*.*.*}
    $ echo ${file2##*.*.*.*}

    想想上面两个的输出是什么?
    $ echo ${file2#*.*.*.*}
    oopp
    $ echo ${file2##*.*.*.*}

    ??知道为什么吗?因为:“*”匹配任何符号包括空。遇到一个“#”时,最后一个“*”就匹配“空”去了。看下面的:
    $ echo ${file2#*.*.*.?}
    opp
    $ echo ${file2#*.*.*.?*}
    opp
    $ echo ${file2##*.*.*.?}
    opp
    $ echo ${file2##*.*.*.?*}

    do you know?

    $ echo $file3
    *ab*de*cd
    看看下面将输出什么?
    $ echo ${file3#*ab}      
    *de*cd
    $ echo ${file3#**}
    *ab*de*cd
    $ echo ${file3##**}

    $ echo ${file3#\*ab}
    *de*cd
    $ echo ${file3#\**}
    ab*de*cd
    $ echo ${file3##\**}

    $ echo ${file3#*a}
    b*de*cd
    $ echo ${file3#\*a}
    b*de*cd

    不知各位有没有发现,“*”在一个“#”中时,并不一定代表“空”,它可能代表一个字符“*”也可能代表其他的什么字符,如上例的:
    “$ echo ${file3#*a}”输出为“b*de*cd”,其实这还是符合最小匹配理论的。这个表达式的意思是:从变量file3的字符串左边开始删除字符,直到遇到第一个字符“a”。所以不要和“$ echo ${file3#\*a}”混淆,虽然两个结果是一样,但意思是不一样的。

    再举几个例子,相信大家更容易理解这段话:
    $ echo $file3
    *ab*de*cd*ab*de                     //注意:出现两个“*ab”
    $ echo ${file3#*a}
    b*de*cd*ab*de                         //删除字符,直到出现第一个“a”,“*”为通配符
    $ echo ${file3##*a}
    b*de                                           //删除字符,直到出现第二个“a”,“*”为通配符
    $ echo ${file3##\*a}
    b*de*cd*ab*de                         //删除字符串“*a”,“*”在“\”表示字符“*”

    除了通配符“*”比较难理解一点,其他的shell通配符就都很容易了。

    至于“%”,和“#”不同的地方,就是从变量字串右部开始。
    ${file%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“/” :/dir1/dir2/dir3
    ${file%%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“/”:(空值)
    ${file%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“.”:/dir1/dir2/dir3/my.file
    ${file%%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“.”:/dir1/dir2/dir3/my
    单匹配格式${var/被替换字符/替换字符}
    全匹配格式${var//被替换字符/替换字符}
    例子:
    [test]# echo ${ip/./@}
    324@2354.329.5324
    [test]# echo ${ip/./,}
    324,2354.329.5324
    [test]# echo ${ip/./ }
    324 2354.329.5324
    [test]# echo ${ip//./ }
    324 2354 329 5324
    [test]# echo ${ip//./,}
    324,2354,329,5324
    [test]# echo ${ip//./@}
    324@2354@329@5324
    总结一点结果.${}中:
    /代表字符串的替换.
    :代表字符串的提取.
    #和%公别代表左截和右截.

    linux大硬盘分区parted

    linux大硬盘分区parted

    我们来看一下两种分区表
    MBR
    分区表:(MBR含义:主引导记录)
    所支持的最大卷:2T T; terabytes,1TB=1024GB
    对分区的设限:最多4个主分区或3个主分区加一个扩展分区(扩展分区中支持无限制的逻辑驱动器)

    GPT
    分区表:(GPT含义:GUID分区表)
    支持最大卷:18EB,(Eexabytes,1EB=1024TB
    每个磁盘最多支持128个分区

    假设要用parted/dev/sdb(大小为6000G)进行分区操作:

    1
    、进入系统执行:
    #parted /dev/sdb

    2
    、建立磁盘label

    mklabel GPT

    3
    、按p键,查看磁盘可用空间,显示单位为M6000G应该显示大致

    : /dev/sdb 的磁盘几何结构:0.000-6000000.000 兆字节

    4
    、创建分区:
    (parted)后输入:
    mkpart
    并按照提示操作

    分区类型? primary/主分区/extended/扩展分区? p (如果要创建扩展分区 此处
    输入e
    文件系统类型? [ext2]? (这里直接回车,分区创建完毕后通过mkfs.ext3
    /dev/sdb*
    建立文件系统)
    起始点?0
    结束点?-1

    5
    、按p键查看刚创建的分区是否已经成功。

    6
    、如果成功,键入quit退出parted

    7
    、使用mkfs.ext3 /dev/sdb1 来创建文件系统

     
    fdisk
    命令虽然很交互,操作也方便,但是对于大于2T的磁盘无法操作,如果我们想用大于2T的磁盘怎么办?可以把磁盘转化为GPT格式。
     

    GPT
    格式的磁盘相当于原来MBR磁盘中原来保留4partition table4*16个字节只留第一个16个字节,类似于扩展分区,真正的partition table512字节之后,GPT磁盘没有四个主分区的限制。


    fdisk不支持GPT,我们可以使用parted来对GPT磁盘操作。

    parted
    功能很强大,既可用命令行也可以用于交互式


    在提示符下输入parted就会进入交互式模式,如果有多个磁盘的话,我们需要运行select sdx x为磁盘,来进行磁盘的选择

    parted>

    parted>select sdb               
    假设磁盘为sdb

    parted>mklable gpt              
    MBR磁盘格式化为GPT

    parted>mklable msdos            
    GPT磁盘转化为MBR磁盘

    parted>mkpart primary 0 100     
    划分一个起始位置为0大小为100M的主分区

    parted>mkpart primary 100 200   
    划分一个起始位置为100M大小为100M的主分区

    parted>print                    
    打印当前分区

     

    parted里边不支持ext3的文件系统,所以如果要使用的话,要退出parted进行格式话

    mkfs.ext3 /dev/sdx1

    因为fdisk是不支持GPT磁盘,所以不要使用fdisk -l来查看X磁盘刚才分好的区,看不到的。


    命令行的模式:
    将硬盘转化为GPT磁盘后,执行下列命令

    parted /dev/sdx mkpart primary 0 100  
    划分一个起始位置为0大小为100M的主分区

    Acronym for GUID Partition Table

    GPT was introduced for iA64 systems, to get around a fixed 32 bit issue (2 to the power of 32 is 4 billion times a 512 byte block equals 2 Terabytes) in the PC-BIOS Partition table. Partitions larger than 2 TB require using a GPT disklabel, which differs from the PC-BIOS Partition table in a number of ways:

        * Is easily extensible.
        * Can contain up to 128 primary partitions, as opposed to 4, so there's no need for extended partitions.
        * Allows Partitions larger than 2 TB.
        * Identifies Partitions with a GUID so you can reference that Partition even if disks are moved around.
        * Identifies Partition type with a GUID, thus avoiding the type conflicts that plague the PC-BIOS Partition table format.
        * Provides a 46(?) character UTF-16 partition label to identify Partitions.
        * Has a "fake" MBR for backwards compatibility.
        * Includes a CRC32 to detect corrupt Partition tables.
        * Stores a backup Partition table at the end of the disk.

    Most partitioning tools under Linux will fail to do anything sensible with a > 2 TB Partition. As of this writing, parted(8) is the only one that understands them and will let you set the GPT label on the disk.

    There is a lot of information stating that you cannot boot off a GPT enabled device. Most of the claims imply that the fault is with LILO or GRUB not understanding GPT devices. We've not tested this, but GPT and traditional MBRs will coexist.

    See also:

        * Disk Sectors on GPT Disks from the MS Knowledge Base

    所以在超过2TB,我不能使用交互很好的Fdisk命令,只能磁盘转化为GPT格式。由于GPT格式的磁盘相当于原来MBR磁盘中原来保留4 partition table4*16个字节只留第一个16个字节,其它的类似于扩展分区,真正的partition table512字节之后,所以对GPT磁盘表来讲没有四个主分区的限制。

    GPT磁盘分区表进行操作,我们要使用parted命令。其实parted功能很强大,它可以象fdisk一样既可用命令行也可以用于交互式.
    下面我们就来实际操作吧,在提示符下输入parted就会进入交互式模式

    #  parted  /dev/sdb
    GNU  Parted  1.8.1
    Using  /dev/sdb
    Welcome  to  GNU  Parted!  Type  'help'  to  view  a  list  of  commands.

    (parted) mklabel gpt
    MBR磁盘格式化为GPT

    (parted) mkpart primary 0 100
    划分一个起始位置为0大小为100M的主分区

    (parted) mkpart primary 100 200
    划分一个起始位置为100M大小为100M的主分区

    (parted)  mkpart  primary  0  -1

    划分所有空间到一个分区

    (parted)  print
    打印当前分区

    (parted)  quit

    可能还会用到的一些命令

    (parted) mklable msdos
    如果要反过来.GPT磁盘转化为MBR磁盘

    在这样分完分区后,还要使用mkfs.ext3来进行格式化
    #partprobe
    #mkfs.ext3 -F /dev/sdb1

    记的哦,因为fdisk是不支持GPT磁盘,所以使用fdisk -l来查看磁盘刚才的分区是没有用的.

    命令行的模式:

    将硬盘转化为GPT磁盘后,执行下列命令

    parted /dev/sdx mkpart primary 0 100
    ##
    划分一个起始位置为0大小为100M的主分区

     

    parted /dev/sdb
    p
    mklabel gpt
    GPT
    mkpart primary 0 -1
    mkfs.ext3 /dev/sdb1