/usr/bin/hwloc-gather-topology is in hwloc 1.11.2-3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | #!/bin/sh
#-*-sh-*-
#
# Copyright © 2009 CNRS
# Copyright © 2009-2015 Inria. All rights reserved.
# Copyright © 2009-2012 Université Bordeaux
# See COPYING in top-level directory.
#
prefix="/usr"
exec_prefix="${prefix}"
bindir="${exec_prefix}/bin"
# this will be changed into $bindir/lstopo during make install
lstopo="$bindir/lstopo-no-graphics"
# make sure we use default numeric formats
LANG=C
LC_ALL=C
export LANG LC_ALL
gatherio=0
gatherdmi=0
if [ ! -x "$lstopo" ]
then
error "Could not find lstopo executable in the install or build dir."
exit 1
fi
error()
{
echo $@ 2>&1
}
usage()
{
echo "$0 [options] <savepath>"
echo " Saves the Linux topology files (/sys, /proc, ...) under <savepath>.tar.bz2"
echo " and the corresponding lstopo verbose output under <savepath>.output"
echo "Options:"
echo " --io Gather I/O files (takes much longer and generates much larger tarball)"
echo " --dmi Gather SMBIOS files. Works only when run as root. Requires dmi-sysfs kernel module"
echo "Example:"
echo " $0 /tmp/\$(uname -n)"
}
while [ x`echo "$1" | cut -c1` = x- ] ; do
case $1 in
--io) gatherio=1;;
--dmi) gatherdmi=1;;
*) echo "Unrecognized option: $1"; usage; exit 1;;
esac
shift
done
if test $# -lt 1 -o x$1 = x; then
usage
exit 1
fi
name="$1"
basename=`basename "$name"`
dirname=`dirname "$name"`
if ! mkdir -p "$dirname" ; then
error "Failed to create directory $dirname."
exit 1
fi
if [ ! -w "$dirname" ] ; then
echo "$dirname is not writable."
exit 1
fi
destdir=`mktemp -d`
# Use cat so that we properly get proc/sys files even if their
# file length is wrong
savefile() {
local dest="$1"
local file="$2"
if test -r "$file"; then
dir=`dirname "$file"`
mkdir -p "$dest/$dir" 2>/dev/null
cat "$file" > "$dest/$file" 2>/dev/null
fi
}
savelink() {
local dest="$1"
local file="$2"
dir=`dirname "$file"`
mkdir -p "$dest/$dir" 2>/dev/null
cp -P "$file" "$dest/$file"
}
# Gather the following list of files
cat << EOF | while read -r path ; do savefile "$destdir/$basename" "$path" ; done
/proc/cpuinfo
/proc/meminfo
/proc/mounts
/proc/stat
/proc/self/cpuset
/proc/self/cgroup
EOF
# Get all files from the given directory
# Ignore errors since some files may be missing, and some may be
# restricted to root (but we don't need them).
savedir() {
local dest="$1"
local path="$2"
# gather all directories, including empty ones
find "$path" -type d 2>/dev/null | while read -r dir ; do
mkdir -p "$dest/$dir" 2>/dev/null
done
# gather all files now
find "$path" -type f 2>/dev/null | while read -r file ; do
savefile "$dest" "$file"
done
# gather symlinks
find "$path" -type l 2>/dev/null | while read -r link ; do
savelink "$dest" "$link"
done
}
# Gather the following list of directories
cat << EOF | while read -r path ; do savedir "$destdir/$basename" "$path" ; done
/sys/devices/system/cpu/
/sys/devices/system/node/
/sys/bus/cpu/devices/
/sys/bus/node/devices/
/sys/class/dmi/id/
/sys/devices/virtual/dmi/id/
/sys/kernel/mm/hugepages/
/proc/device-tree/cpus/
EOF
if test "x$HWLOC_DUMPED_HWDATA_DIR" = x; then
savedir "$destdir/$basename" /var/run/hwloc/
else
savedir "$destdir/$basename" "$HWLOC_DUMPED_HWDATA_DIR"
fi
# Optionally gather I/O directories too
if [ x$gatherio = x1 ]; then
cat << EOF | while read -r path ; do savedir "$destdir/$basename" "$path" ; done
/sys/bus/pci/devices/
/sys/bus/pci/slots/
/sys/block/
/sys/class/block/
/sys/class/dma/
/sys/class/drm/
/sys/class/infiniband/
/sys/class/net/
/sys/class/mic/
EOF
ls -d /sys/devices/pci* 2>/dev/null | sed -e 's@$@/@' | while read -r path ; do savedir "$destdir/$basename" "$path" ; done
ls -d /run/udev/data/b* 2>/dev/null | while read -r path ; do savefile "$destdir/$basename" "$path" ; done
fi
if [ x$gatherdmi = x1 ]; then
savedir "$destdir/$basename" /sys/firmware/dmi/
fi
# Get an entire mount point, after decoding its path
# we don't support path with \n since it would break in 'find ... | while read ..." above
savemntpnt() {
local encodedpath=$1
if echo "$1" | grep "\\012" ; then
echo "Ignoring mount point whose filename contains an end of line."
return
fi
local path=$(echo "$1" | sed -e 's@\\134@\\@g' -e 's@\\040@ @g' -e 's@\\011@ @g')
savedir "$destdir/$basename" "${path}/"
}
# Gather cgroup/cpuset mntpnts
cat /proc/mounts | while read -r dummy1 mntpath mnttype mntopts dummy2 ; do
[ x$mnttype = xcpuset ] && savemntpnt "$mntpath"
[ x$mnttype = xcgroup ] && echo $mntopts | grep -w cpuset >/dev/null && savemntpnt "$mntpath"
done
# export /proc/hwloc-nofile-info during lstopo (needs HWLOC_DUMP_NOFILE_INFO with HWLOC_THISSYSTEM=1)
export HWLOC_DUMP_NOFILE_INFO="$destdir/$basename/proc/hwloc-nofile-info"
"$lstopo" - >/dev/null
# disable HWLOC_DUMP_NOFILE_INFO for next lstopo invocation
export HWLOC_DUMP_NOFILE_INFO=
# Create the archive and keep the tree in /tmp for testing
( cd "$destdir/" && tar cfj "$basename.tar.bz2" "$basename" )
mv "$destdir/$basename.tar.bz2" "$dirname/$basename.tar.bz2"
echo "Hierarchy gathered in $dirname/$basename.tar.bz2 and kept in $destdir/$basename/"
# Generate the output as well
# we need "Topology not from this system" in the output so as to make test-topology.sh happy
export HWLOC_THISSYSTEM=0
"$lstopo" - -v > "$dirname/$basename.output"
echo "Expected topology output stored in $dirname/$basename.output"
exit 0
|