最近学习xen虚拟化,需要移植最小化系统,之前也学习过最小化系统,发现一段时间不用,里面的东西基本上都忘记了。今天正好来回顾下。

命令移植需要移植两个东西:

  1. 命令的本身
  2. 命令依赖的库

首先移植命令本身:

  1. 找到命令所在的地方.
  1. 通过which 找到命令的完整路径。

linux 迁移mysql数据目录_linux 迁移mysql数据目录


 

 


会发现还含有alias的信息,并且,命令前面还有空格。需要提取出来命令的路径。

首先去掉alias

linux 迁移mysql数据目录_最小化_02

然后只匹配/bin/ls,相当于匹配/之后的任意字符:

linux 迁移mysql数据目录_linux 迁移mysql数据目录_03

  1. 复制命令道目标目录的地方。由于是移植,需要目录结构和命令的目录结构保持一致。。那么难题来了,一个命令你需要找出它的目标位置,且要先判断是否存在这个目标位置,不存在的话,需要新建。县找出命令之前的目录。。

linux 迁移mysql数据目录_最小化_04

这两个grep都可以用来找出目录得地址。

那么在命令的基础上找出目录的命令则为 grep -o "^/.*/"

  1. 要找出库文件,并且对库文件进行复制。

通过ldd 可以找出命令所需要的库文件。

linux 迁移mysql数据目录_目录结构_05

如何提取到/lib64/libcap.so.2这个东西出来。好难。这样就提取出来了。

linux 迁移mysql数据目录_目录结构_06

  1. 复制函数

如果是命令复制的话,只需要复制一次,如果是库复制的话,需要复制很多次。

命令复制:

假设命令为$BIN_COMMAND 要复制的地方为$DEST_PATH

复制命令为

acp{
CPATH=echo $1 | grep -o "/.*/"
[! d $DEST_PATH$PATH ] && mkdir $DEST_PATH$CPATH
[ ! e $DEST_PATH$PATH$1 ] && cp $1 $DEST_PATH$CPATH
}

以上的是单独的复制功能,那么整个复制都需要调用这个函数。

复制整个的过程为:

bin_cp{
for i in {ldd $1 | grep -o "/.*[^[:space:]]*"};
do acp I
done
echo "lib copy complete"
acp $1 && echo "bin $1 copy complete"
}
  1. 再 加上控制循环。
read -p "please input your commad" CMD
until $CMD=q ;do 
! wich $CMD && read -p "commad err,please input again" $CMD && continue
$BIN_COMMAND=`which $CMD | grep -v "^alais" | grep -o "/.*"
bin_cp $BIN_COMMAND
read -p "please input your commad" CMD
done

 

  1. 完整的代码:
#!/bin/bash
DEST_PATH=/mnt
acp() {
        CPATH=`echo $1 | grep -o "/.*/"`
        [ ! -d $DEST_PATH$CPATH ] && mkdir -p $DEST_PATH$CPATH
        [ ! -e $DEST_PATH$1 ] && cp $1 $DEST_PATH$CPATH
}
bin_cp() {
        for i in `ldd $1 | grep -o "/[^[:space:]]*"`;
                do acp $i
        done
        echo "lib copy complete"
        acp $1 && echo "bin $1 copy complete"
}
 
read -p "please input your commad" CMD
until [ $CMD == 'q' ] ;do
        ! which $CMD && read -p "commad err,please input again" CMD && continue
        BIN_COMMAND=`which $CMD | grep -v "^alias" | grep -o "/.*"`
        bin_cp $BIN_COMMAND
        read -p "please input your commad" CMD
done