最近学习xen虚拟化,需要移植最小化系统,之前也学习过最小化系统,发现一段时间不用,里面的东西基本上都忘记了。今天正好来回顾下。
命令移植需要移植两个东西:
- 命令的本身
- 命令依赖的库
首先移植命令本身:
- 找到命令所在的地方.
- 通过which 找到命令的完整路径。
|
|
会发现还含有alias的信息,并且,命令前面还有空格。需要提取出来命令的路径。
首先去掉alias
然后只匹配/bin/ls,相当于匹配/之后的任意字符:
- 复制命令道目标目录的地方。由于是移植,需要目录结构和命令的目录结构保持一致。。那么难题来了,一个命令你需要找出它的目标位置,且要先判断是否存在这个目标位置,不存在的话,需要新建。县找出命令之前的目录。。
这两个grep都可以用来找出目录得地址。
那么在命令的基础上找出目录的命令则为 grep -o "^/.*/"
- 要找出库文件,并且对库文件进行复制。
通过ldd 可以找出命令所需要的库文件。
如何提取到/lib64/libcap.so.2这个东西出来。好难。这样就提取出来了。
- 复制函数
如果是命令复制的话,只需要复制一次,如果是库复制的话,需要复制很多次。
命令复制:
假设命令为$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"
}
- 再 加上控制循环。
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
- 完整的代码:
#!/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