<div dir="ltr"><div>Hello,</div><div><br></div><div>as an unprivileged user one is able to keep network namespaces from expiring by opening /proc/<pid>/net/dev of other processes. I've previously put this on stackexchange [1] and then bugzilla [2]. That's been a while though, so posting here for a bit more visibility in case it's something that's worth fixing.</div><div><br></div><div>The reproducer is roughly as follows. As root:<br></div><div># echo "100" > /proc/sys/user/max_net_namespaces<br></div><div># while true ; do (unshare -n bash -c 'sleep 0.3 && readlink /proc/self/ns/net') || sleep 0.5  ; done</div><div><br></div><div>As unprivileged user in a second terminal, run the below Python script [3]:</div><div># python3 pin_net_namespaces.py<br></div><div><br></div><div>After about one minute the first terminal will show the following until the Python process keeping the network namespaces alive is terminated.<br></div><div>...<br>unshare: unshare failed: No space left on device<br>unshare: unshare failed: No space left on device</div><div><br></div><div>Without the change to max_net_namespaces reproducing just very long, but then also kernel memory grows fairly large.<br></div><div><br></div><div>Does that  seem like problematic behavior?  I had attached a patch and tests to [2], but I fall into the kernel newbie category, so not sure how useful.<br></div><div><br></div><div>Thanks,</div><div>   Arne<br></div><div><br></div><div><br></div><div>[1] <a href="https://unix.stackexchange.com/questions/576718/opening-proc-pid-net-dev-prevents-network-namespace-from-expiring-is-this-ex/">https://unix.stackexchange.com/questions/576718/opening-proc-pid-net-dev-prevents-network-namespace-from-expiring-is-this-ex/</a></div><div>[2] <a href="https://bugzilla.kernel.org/show_bug.cgi?id=207351">https://bugzilla.kernel.org/show_bug.cgi?id=207351</a></div><div></div><div><br></div><div>[3] $ cat pin_net_namespaces.py<br></div><div><div>#!/usr/bin/env python3<br>import glob<br>import os<br>import time<br><br>net_namespaces = {}<br><br>while True:<br>    for net_dev in glob.glob("/proc/*/net/dev"):<br>        try:<br>            ino = os.stat(net_dev).st_ino<br>            if ino not in net_namespaces:<br>                net_namespaces[ino] = open(net_dev)<br>                print("Have", len(net_namespaces), "namespaces...")<br>        except FileNotFoundError:<br>            # not fast enough...<br>            pass<br><br>    time.sleep(0.2)</div><div>===<br></div></div></div>