|
@@ -65,7 +65,7 @@ function without2() {
|
|
|
# 查找依赖 pkgname 的包
|
|
|
function find_who_depend() {
|
|
|
pkgname="bash"
|
|
|
- result=$(awk -v SEARCH_STR="${pkgname}" -f depends.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
|
|
|
+ result=$(awk -v SEARCH_STR="${pkgname}" -f depends.awk ${path_to_package_file})
|
|
|
echo "${result}"
|
|
|
}
|
|
|
|
|
@@ -87,13 +87,13 @@ function get_deps() {
|
|
|
function get_pkg_deps() {
|
|
|
. analysis.sh
|
|
|
pkgname="libpam-runtime"
|
|
|
- analysis_sigle_file2 ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages ${pkgname} |
|
|
|
+ analysis_sigle_file2 ${path_to_package_file} ${pkgname} |
|
|
|
grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' |
|
|
|
tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq
|
|
|
}
|
|
|
|
|
|
# bash包依赖
|
|
|
-# resolve_deps bash
|
|
|
+# resolve_deps2 bash
|
|
|
|
|
|
########## functions ##########
|
|
|
|
|
@@ -116,11 +116,17 @@ function config_my() {
|
|
|
SUITES="v101"
|
|
|
COMPONENTS="main"
|
|
|
ARCH="amd64"
|
|
|
+ TARGET_DIR="/var/tmp/download"
|
|
|
+ if [ ! -d "${TARGET_DIR}" ]; then
|
|
|
+ mkdir -p "${TARGET_DIR}"
|
|
|
+ fi
|
|
|
TARGET="/var/tmp/rootfs"
|
|
|
+ if [ ! -d "${TARGET}" ]; then
|
|
|
+ sudo mkdir -p "${TARGET}"
|
|
|
+ fi
|
|
|
}
|
|
|
|
|
|
function download_indices() {
|
|
|
- # ${MIRRORS%% *}
|
|
|
for m in ${MIRRORS}; do
|
|
|
for s in ${SUITES}; do
|
|
|
sInRelease="${m}/dists/${s}/InRelease"
|
|
@@ -131,42 +137,56 @@ function download_indices() {
|
|
|
wgetfile ${sRelease}
|
|
|
wgetfile ${sRelease_gpg}
|
|
|
|
|
|
+ package_urls=""
|
|
|
for c in ${COMPONENTS}; do
|
|
|
- path="${m}/dists/$s/$c/binary-$ARCH/Packages.gz"
|
|
|
- # echo ${path}
|
|
|
- wgetfile ${path}
|
|
|
+ url="${m}/dists/$s/$c/binary-$ARCH/Packages.gz"
|
|
|
+ # echo ${url}
|
|
|
+ package_urls="${url} ${package_urls}"
|
|
|
+ wgetfile ${url}
|
|
|
done
|
|
|
done
|
|
|
done
|
|
|
}
|
|
|
|
|
|
-function resolve_deps() {
|
|
|
+function url_to_path() {
|
|
|
+ filepath="${TARGET_DIR}/${1#*//}"
|
|
|
+ echo ${filepath%.*}
|
|
|
+}
|
|
|
+
|
|
|
+function resolve_deps2() {
|
|
|
local PKGS="$*"
|
|
|
local ALLPKGS="$PKGS"
|
|
|
local ALLPKGS2=""
|
|
|
+
|
|
|
while [ "$PKGS" != "" ]; do
|
|
|
# 查找依赖包
|
|
|
- local NEWPKGS=""
|
|
|
- NEWPKGS=$(echo "${PKGS}" | tr ' ' '\n' | xargs -i analysis.sh --repo "${TARGET_DIR}/172.29.220.242/mirror/kylin/dists" --pkg {} |
|
|
|
- grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' |
|
|
|
- tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq)
|
|
|
-
|
|
|
+ local NEWPKGS=$(
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ for i in $(echo "${PKGS}" | tr ' ' '\n'); do
|
|
|
+ match="Package: ${i}"
|
|
|
+ if grep -q "^${match}$" "$(url_to_path ${p})"; then
|
|
|
+ sed -n "/^${match}$/,/^$/p" "$(url_to_path ${p})"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ done | grep -E "^Depends:|^Pre-Depends" | sed 's/^.*Depends://' | tr ',' '\n' | sed 's/|.*//' | sed 's#(.*)##g' | xargs | tr ' ' '\n' | sort | uniq
|
|
|
+ )
|
|
|
mylog "newpkgs.txt2" "$(echo ${NEWPKGS} | xargs | tr ' ' '\n')"
|
|
|
|
|
|
PKGS=$(echo "$PKGS $NEWPKGS" | tr ' ' '\n' | sort | uniq)
|
|
|
|
|
|
# 真实的包
|
|
|
local REALPKGS=""
|
|
|
- p="${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages"
|
|
|
- for i in $PKGS; do
|
|
|
- if grep -q "^Package: ${i}$" ${p}; then
|
|
|
- # echo ${i}
|
|
|
- if [ -n "${REALPKGS}" ]; then
|
|
|
- REALPKGS="${REALPKGS} ${i}"
|
|
|
- else
|
|
|
- REALPKGS="${i}"
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ for i in $PKGS; do
|
|
|
+ if grep -q "^Package: ${i}$" "$(url_to_path ${p})"; then
|
|
|
+ # echo ${i}
|
|
|
+ if [ -n "${REALPKGS}" ]; then
|
|
|
+ REALPKGS="${REALPKGS} ${i}"
|
|
|
+ else
|
|
|
+ REALPKGS="${i}"
|
|
|
+ fi
|
|
|
fi
|
|
|
- fi
|
|
|
+ done
|
|
|
done
|
|
|
|
|
|
mylog "realpkgs.txt2" "$(echo ${REALPKGS} | xargs | tr ' ' '\n')"
|
|
@@ -182,17 +202,23 @@ function resolve_deps() {
|
|
|
|
|
|
function work_out_debs() {
|
|
|
PRIO="required"
|
|
|
- required=$(awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
|
|
|
+ required=$(
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk "$(url_to_path ${p})"
|
|
|
+ done
|
|
|
+ )
|
|
|
mylog "01-required.txt2" "${required}"
|
|
|
-
|
|
|
- required_deps=$(resolve_deps "${required}")
|
|
|
+ required_deps=$(resolve_deps2 "${required}")
|
|
|
mylog "01-required@deps.txt2" "$(echo ${required_deps} | xargs | tr ' ' '\n')"
|
|
|
|
|
|
PRIO="important"
|
|
|
- important=$(awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages)
|
|
|
+ important=$(
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ awk -v SEARCH_STR="${PRIO}" -f ${SHELL_DIR}/analysis.awk "$(url_to_path ${p})"
|
|
|
+ done
|
|
|
+ )
|
|
|
mylog "02-important.txt2" "${important}"
|
|
|
-
|
|
|
- important_deps=$(resolve_deps "${important}")
|
|
|
+ important_deps=$(resolve_deps2 "${important}")
|
|
|
mylog "02-important@deps.txt2" "$(echo ${important_deps} | xargs | tr ' ' '\n')"
|
|
|
important_deps=$(without "$important_deps" "$required_deps")
|
|
|
mylog "02-important@deps@without@required.txt2" "$(echo ${important_deps} | xargs | tr ' ' '\n')"
|
|
@@ -201,17 +227,29 @@ function work_out_debs() {
|
|
|
function download_debs() {
|
|
|
ALL_PKGS="$*"
|
|
|
MIRROR=${MIRRORS%% *}
|
|
|
- for p in ${ALL_PKGS}; do
|
|
|
- filename="${MIRROR}/$(analysis.sh --repo ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists --pkg $p | grep '^Filename: ' | awk '{print $2}')"
|
|
|
- echo "$p $filename"
|
|
|
- wgetfile $filename
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ for i in ${ALL_PKGS}; do
|
|
|
+ match="Package: ${i}"
|
|
|
+ filename=$(
|
|
|
+ if grep -q "^${match}$" "$(url_to_path ${p})"; then
|
|
|
+ sed -n "/^${match}$/,/^$/p" "$(url_to_path ${p})"
|
|
|
+ fi | grep '^Filename: ' | awk '{print $2}'
|
|
|
+ )
|
|
|
+ # filename="${MIRROR}/$(analysis.sh --repo ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists --pkg $i | grep '^Filename: ' | awk '{print $2}')"
|
|
|
+ echo "$i $filename"
|
|
|
+ wgetfile ${MIRROR}/$filename
|
|
|
+ done
|
|
|
done | column -t >${TARGET_DIR}/deb.list
|
|
|
}
|
|
|
|
|
|
-debfor() {
|
|
|
- for p in "$@"; do
|
|
|
- local filename=$(grep "^${p} " ${TARGET_DIR}/deb.list | awk '{print $2}')
|
|
|
- echo "${TARGET_DIR}/${filename#*//}"
|
|
|
+debfor2() {
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ p=${p#*//}
|
|
|
+ p=${p%dists*}
|
|
|
+ for i in "$@"; do
|
|
|
+ local filename=$(grep "^${i} " ${TARGET_DIR}/deb.list | awk '{print $2}')
|
|
|
+ echo "${TARGET_DIR}/${p}/${filename}"
|
|
|
+ done
|
|
|
done
|
|
|
}
|
|
|
|
|
@@ -281,7 +319,7 @@ function my_first_stage_install() {
|
|
|
|
|
|
setup_merged_usr
|
|
|
|
|
|
- debfor $required_deps | xargs -i bash -c "dpkg-deb --fsys-tarfile {} | tar -k -xvf - -C $TARGET"
|
|
|
+ debfor2 $required_deps | xargs -i bash -c "dpkg-deb --fsys-tarfile {} | tar -k -xvf - -C $TARGET"
|
|
|
|
|
|
mkdir -p "$TARGET/var/lib/dpkg"
|
|
|
: >"$TARGET/var/lib/dpkg/status"
|
|
@@ -307,7 +345,7 @@ function my_first_stage_install() {
|
|
|
|
|
|
function my_second_stage_install() {
|
|
|
# 拷贝deb到rootfs
|
|
|
- [ -d $TARGET/var/tmp/172.29.220.242 ] || sudo cp -rf /var/tmp/172.29.220.242 $TARGET/var/tmp
|
|
|
+ [ -d $TARGET/var/tmp/download ] || sudo cp -rf ${TARGET_DIR} $TARGET/var/tmp
|
|
|
|
|
|
in_target() {
|
|
|
sudo chroot $TARGET $*
|
|
@@ -315,7 +353,7 @@ function my_second_stage_install() {
|
|
|
|
|
|
x_feign_install() {
|
|
|
local pkg="$1"
|
|
|
- local deb="$(debfor $pkg)"
|
|
|
+ local deb="$(debfor2 $pkg)"
|
|
|
local ver="$(in_target dpkg-deb -f "$deb" Version)"
|
|
|
|
|
|
echo "Package: $pkg
|
|
@@ -330,8 +368,8 @@ Status: install ok installed
|
|
|
x_feign_install dpkg
|
|
|
|
|
|
x_core_install() {
|
|
|
- mylog2 in_target dpkg --force-depends --install $(debfor "$@")
|
|
|
- yes | in_target dpkg --force-depends --install $(debfor "$@")
|
|
|
+ mylog2 in_target dpkg --force-depends --install $(debfor2 "$@")
|
|
|
+ yes | in_target dpkg --force-depends --install $(debfor2 "$@")
|
|
|
}
|
|
|
|
|
|
p() {
|
|
@@ -374,8 +412,8 @@ Status: install ok installed
|
|
|
|
|
|
# TODO: repeat some times
|
|
|
# exec 7>&1
|
|
|
- # yes | in_target in_targetdpkg --status-fd 8 --force-depends --unpack $(debfor $required_deps) 8>&1 1>&7
|
|
|
- yes | in_target dpkg --force-depends --unpack $(debfor $required_deps)
|
|
|
+ # yes | in_target in_targetdpkg --status-fd 8 --force-depends --unpack $(debfor2 $required_deps) 8>&1 1>&7
|
|
|
+ yes | in_target dpkg --force-depends --unpack $(debfor2 $required_deps)
|
|
|
|
|
|
echo "Configuring required packages..."
|
|
|
|
|
@@ -400,8 +438,10 @@ Status: install ok installed
|
|
|
echo "Unpacking the base system..."
|
|
|
|
|
|
# setup_available
|
|
|
- for p in ${required_deps} ${important_deps}; do
|
|
|
- sed -n "/^Package: ${p}$/,/^$/p" ${TARGET_DIR}/172.29.220.242/mirror/kylin/dists/v101/main/binary-amd64/Packages
|
|
|
+ for p in ${package_urls}; do
|
|
|
+ for i in ${required_deps} ${important_deps}; do
|
|
|
+ sed -n "/^Package: ${i}$/,/^$/p" "$(url_to_path ${p})"
|
|
|
+ done
|
|
|
done >"$TARGET/var/lib/dpkg/available"
|
|
|
|
|
|
get_next_predep() {
|
|
@@ -413,15 +453,15 @@ Status: install ok installed
|
|
|
done_predeps=
|
|
|
while predep=$(get_next_predep); do
|
|
|
# We have to resolve dependencies of pre-dependencies manually because dpkg --predep-package doesn't handle this.
|
|
|
- predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
|
|
|
- yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
|
|
|
+ predep=$(without "$(without "$(resolve_deps2 $predep)" "$required")" "$done_predeps")
|
|
|
+ yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor2 $predep)
|
|
|
base=$(without "$base" "$predep")
|
|
|
done_predeps="$done_predeps $predep"
|
|
|
done
|
|
|
|
|
|
if [ -n "$base" ]; then
|
|
|
- # yes | in_target dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7
|
|
|
- yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base)
|
|
|
+ # yes | in_target dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor2 $base) 8>&1 1>&7
|
|
|
+ yes | in_target dpkg --force-overwrite --force-confold --skip-same-version --unpack $(debfor2 $base)
|
|
|
|
|
|
echo "Configuring the base system..."
|
|
|
|
|
@@ -434,34 +474,37 @@ Status: install ok installed
|
|
|
|
|
|
echo "Configuring base system"
|
|
|
echo "Base system installed successfully."
|
|
|
+
|
|
|
+ # rm -rf $TARGET/var/tmp/download
|
|
|
}
|
|
|
|
|
|
-TARGET_DIR="/var/tmp"
|
|
|
-if [ ! -d "${TARGET_DIR}" ]; then
|
|
|
- mkdir -p "${TARGET_DIR}"
|
|
|
-fi
|
|
|
SHELL_DIR=$(dirname $(readlink -f $0))
|
|
|
|
|
|
trap "exit_function" 0
|
|
|
|
|
|
exit_function() {
|
|
|
- mountpoint -q $TARGET/proc && sudo umount $TARGET/proc
|
|
|
- mountpoint -q $TARGET/sys && sudo umount $TARGET/sys
|
|
|
+ if mountpoint -q $TARGET/proc; then
|
|
|
+ sudo umount $TARGET/proc
|
|
|
+ fi
|
|
|
+
|
|
|
+ if mountpoint -q $TARGET/sys; then
|
|
|
+ sudo umount $TARGET/sys
|
|
|
+ fi
|
|
|
+ echo "exit_function" >/dev/null
|
|
|
}
|
|
|
|
|
|
# config_ubuntu
|
|
|
# config_kylin
|
|
|
config_my
|
|
|
|
|
|
-# download_indices
|
|
|
-
|
|
|
+download_indices
|
|
|
# work_out_debs
|
|
|
# all_debs=$(echo "${required_deps} ${important_deps}" | xargs | tr ' ' '\n' | sort | uniq)
|
|
|
# # echo "${all_debs}"
|
|
|
-
|
|
|
# download_debs "${all_debs}"
|
|
|
|
|
|
-required_deps="$(cat ${TARGET_DIR}/01-required@deps.txt2)"
|
|
|
-important_deps="$(cat ${TARGET_DIR}/02-important@deps@without@required.txt2)"
|
|
|
+required_deps="$(cat /var/tmp/01-required@deps.txt2)"
|
|
|
+important_deps="$(cat /var/tmp/02-important@deps@without@required.txt2)"
|
|
|
+
|
|
|
my_first_stage_install
|
|
|
my_second_stage_install
|