diff --git a/script/tools/chroot.sh b/script/tools/chroot.sh index 85ae66926019cd9f57247be08034047652ebd123..5653cb518827dbb528518b81b153cf34610d72bc 100644 --- a/script/tools/chroot.sh +++ b/script/tools/chroot.sh @@ -14,7 +14,7 @@ function chroot_addbep() function chroot_init() { chroot_clean - pkglist="pigz expect wget bash vim grep patch tar gzip bzip2 openssh-clients yum perl createrepo_c dnf-utils git kpartx xz" + pkglist="pigz expect wget bash vim grep patch tar gzip bzip2 openssh-clients yum perl createrepo_c dnf-utils git kpartx xz libffi expat ca-certificates" if [[ ${ARCH} == "ppc64le" ]];then pkglist="${pkglist} grub2-tools grub2-ppc64le-modules" fi @@ -72,25 +72,94 @@ DEVLIST function chroot_clean() { - pwd + pwd ls / set +e rpm -e openEuler_chroot if [ -d "${OPENEULER_CHROOT_PATH}" ]; then - lsof | grep openeuler - for openeuler_pid in $(lsof | grep '/usr1/openeuler/' | awk '{print $2}') - do - kill -9 "${openeuler_pid}" + log_info "Starting comprehensive cleanup of ${OPENEULER_CHROOT_PATH}..." + + log_info "Killing processes using ${OPENEULER_CHROOT_PATH}..." + + local pids=$(lsof +D "${OPENEULER_CHROOT_PATH}" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u) + if [ -n "$pids" ]; then + log_info "Found PIDs using the directory: $pids" + kill -9 $pids 2>/dev/null + sleep 2 + fi + + log_info "Unmounting all mount points under ${OPENEULER_CHROOT_PATH}..." + + mount | grep "${OPENEULER_CHROOT_PATH}" | awk '{print $3}' | \ + awk -F'/' '{print NF-1 " " $0}' | sort -nr | cut -d' ' -f2 | \ + while read mount_point; do + log_info "Unmounting: $mount_point" + umount -f "$mount_point" 2>/dev/null || umount -l "$mount_point" 2>/dev/null + done + + for point in proc sys dev/pts dev run tmp; do + if mountpoint -q "${OPENEULER_CHROOT_PATH}/${point}" 2>/dev/null; then + log_info "Unmounting standard mount point: ${point}" + umount -f "${OPENEULER_CHROOT_PATH}/${point}" 2>/dev/null + fi done - umount "${OPENEULER_CHROOT_PATH}/proc" - umount "${OPENEULER_CHROOT_PATH}/sys" - umount "${OPENEULER_CHROOT_PATH}/dev/pts" - umount "${OPENEULER_CHROOT_PATH}/dev" - rm -rf "${OPENEULER_CHROOT_PATH}" - fi - if [ -d "${OPENEULER_CHROOT_PATH}" ]; then - log_error "delete ${OPENEULER_CHROOT_PATH} failed" + + log_info "Cleaning up loop devices..." + losetup -a | grep -i "${OPENEULER_CHROOT_PATH}" | while read line; do + local loop_dev=$(echo "$line" | cut -d: -f1) + log_info "Removing loop device: $loop_dev" + umount -f "$loop_dev" 2>/dev/null + losetup -d "$loop_dev" 2>/dev/null + done + + log_info "Using fuser to kill remaining processes..." + fuser -k -9 "${OPENEULER_CHROOT_PATH}" 2>/dev/null || true + + # 等待资源释放 + sleep 3 + + pids=$(lsof +D "${OPENEULER_CHROOT_PATH}" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u) + if [ -n "$pids" ]; then + log_info "Killing remaining PIDs: $pids" + kill -9 $pids 2>/dev/null + sleep 2 + fi + + log_info "Attempting to remove directory..." + local retry_count=0 + local max_retries=3 + + while [ $retry_count -lt $max_retries ]; do + rm -rf "${OPENEULER_CHROOT_PATH}" 2>/dev/null && break + + retry_count=$((retry_count + 1)) + log_info "Retry $retry_count failed, waiting before next attempt..." + sleep 2 + + mount | grep "${OPENEULER_CHROOT_PATH}" | awk '{print $3}' | \ + while read mount_point; do + umount -l "$mount_point" 2>/dev/null || true + done + done + + # 最终检查 + if [ -d "${OPENEULER_CHROOT_PATH}" ]; then + log_info "WARNING: Directory still exists after cleanup attempts:" + ls -la "${OPENEULER_CHROOT_PATH}" 2>/dev/null || log_info "Cannot list directory" + + # 显示占用信息以便调试 + log_info "Current usage:" + lsof +D "${OPENEULER_CHROOT_PATH}" 2>/dev/null || log_info "No processes using directory" + mount | grep "${OPENEULER_CHROOT_PATH}" 2>/dev/null || log_info "No mount points found" + + return 1 + else + log_info "Successfully cleaned up ${OPENEULER_CHROOT_PATH}" + fi + else + log_info "Directory ${OPENEULER_CHROOT_PATH} does not exist, nothing to clean" fi + set -e }