Guest User

Untitled

a guest
Jan 20th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. set -eu
  4.  
  5. usage() {
  6. printf "usage: %s <filesystem>\n\n" "$(basename "$0")"
  7. }
  8.  
  9. if [ $# != 1 ]; then usage >&2; exit 1; fi
  10. fs="${1%/}"
  11. test -d "$fs" || {
  12. echo "** ERROR: \"$fs\" does not exists"
  13. return 1
  14. }
  15.  
  16.  
  17. debug=${debug:-}
  18.  
  19. size=$((1024 * $(df --output=avail "$fs" | tail -n 1)))
  20. split=$((2 * 1024 * 1024 * 1024))
  21.  
  22. # just for quick test
  23. if [ -n "$debug" ]; then
  24. size=$((1024 * 1024 * 10))
  25. split=$((1 * 1024 * 1024))
  26. fi
  27.  
  28.  
  29. # Pretty print a number
  30. ppn() {
  31. local n s sufx
  32. n="$1"
  33. sufx=""
  34. s="$n$sufx"
  35. while [ ${#s} -gt 5 ] && [ "$sufx" != "Yi" ]; do
  36. case "$sufx" in
  37. (Zi) sufx="Yi" ;;
  38. (Ei) sufx="Zi" ;;
  39. (Pi) sufx="Ei" ;;
  40. (Ti) sufx="Pi" ;;
  41. (Gi) sufx="Ti" ;;
  42. (Mi) sufx="Gi" ;;
  43. (Ki) sufx="Mi" ;;
  44. ("") sufx="Ki" ;;
  45. esac
  46. n=$((n / 1024))
  47. s="$n$sufx"
  48. done
  49. echo "$s"
  50. }
  51.  
  52. zero() {
  53. dd if=/dev/zero bs=1M count="$(((size + 1024*1024 - 1) /(1024*1024)))" status=none
  54. }
  55.  
  56. fseq() {
  57. local offset i remain
  58. i=0
  59. remain="$size"
  60. for offset in $(seq 0 "$split" "$size"); do
  61. if [ "$remain" -lt "$split" ]; then
  62. echo "$i" "$offset" "$remain"
  63. else
  64. echo "$i" "$offset" "$split"
  65. fi
  66. i=$((i+1))
  67. remain=$((remain - split))
  68. test "$remain" -eq "0" && break
  69. done
  70. }
  71.  
  72. wipe() {
  73. local wd i offset n filename count
  74. wd="$1"
  75. exec 3<&0
  76. exec <&-
  77. fseq | while read -r i offset n; do
  78. filename="$(printf "%s/_wipe%04d" "$wd" "$i")"
  79. if [ -n "$debug" ]; then
  80. printf>&2 "# segment %d/%d (%s, %s remaining)\n" \
  81. "$((i + 1))" "$segments" "$(ppn "$n")" "$(ppn $((size - offset)))"
  82. printf>&2 "# Creating %s\n" "$filename"
  83. fi
  84. count=$((n /1024 /64))
  85. dd <&3 "of=$filename" oflag=sync,noatime status=none ibs=64K obs=1M "count=$count"
  86. done
  87. }
  88.  
  89. target="$fs/_wipe"
  90. test -d "$target" && rm -fr "$target"
  91. test -d "$target" && {
  92. echo "** ERROR: \"$target\" already exists and is not a directory"
  93. exit 1
  94. }
  95. mkdir "$target"
  96.  
  97. if [ -n "$debug" ]; then
  98. segments=$(( (size + split - 1) / split ))
  99. printf>&2 "# %d segments will be created\n" "$segments"
  100. fi
  101.  
  102. zero | pv -s "$size" -B 64K | wipe "$target"
  103. [ -n "$debug" ] && ls -lh "$target"
  104. rm -vfr "$target"
Add Comment
Please, Sign In to add comment