Guest User

Untitled

a guest
Nov 20th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. #!/bin/sh
  2. # sane_chroot: sanity-preserving chroot(1)
  3. set -e
  4.  
  5. finish() {
  6. prefix="$(realpath "$prefix")"
  7. if [ "x$(unlock)" != "x0" ]; then
  8. return 0
  9. else
  10. echo "Shutting down..."
  11. fi
  12.  
  13. found=1
  14. while [ "x$found" = "x1" ]; do
  15. found=0
  16. for pid in $(ls -1 /proc); do
  17. link=$(readlink /proc/$pid/root || true)
  18. if [ "x$link" != "x" ]; then
  19. if [ "x${link:0:${#prefix}}" == "x$prefix" ]; then
  20. kill -9 $pid && echo "Killed process $pid" || true
  21. found=1
  22. fi
  23. fi
  24. done
  25. done
  26.  
  27. umount -v -l "$prefix"/tmp/.X11-unix || true
  28. umount -v -l "$prefix"/dev || true
  29. umount -v -l "$prefix"/proc || true
  30. umount -v -l "$prefix"/sys || true
  31. rm -v "$lockfile"
  32. }
  33.  
  34. lock() {
  35. local count
  36. count="$(cat "$lockfile" 2>/dev/null || echo 0)"
  37. echo $(expr "$count" + 1) > "$lockfile"
  38. }
  39.  
  40. unlock() {
  41. local count
  42. count="$(cat "$lockfile")"
  43. echo $(expr "$count" - 1) | tee "$lockfile"
  44. }
  45.  
  46. prefix="$1"
  47. lockfile="$1/.chroot_lock"
  48. shift
  49. if [ "x" = "x$prefix" ] || ! [ -d "$prefix" ]; then
  50. printf "error: invalid chroot directory\n" >&2
  51. exit 1
  52. fi
  53.  
  54. if [ $# = 0 ]; then
  55. printf "error: at least two arguments required" >&2
  56. fi
  57.  
  58. trap finish EXIT
  59. lock
  60. mkdir -p "$prefix/tmp/.X11-unix"
  61. ln -sfv /tmp/.X11-unix "$prefix"/tmp/.X11-unix || echo "warning: X11 will not be available" >&2
  62. mount -v -t devtmpfs devtmpfs "$prefix"/dev || true
  63. mount -v --rbind /dev/pts "$prefix"/dev/pts || true
  64. mount -v -t proc proc "$prefix"/proc || true
  65. mount -v -t sysfs sysfs "$prefix"/sys || true
  66. chroot "$prefix" "$@" || exit 0
Add Comment
Please, Sign In to add comment