একটি পদ্ধতির পিআইডি নেমস্পেস ব্যবহার করা যেতে পারে:
আপনার সিস্টেমকে init=/some/cmd
কার্নেল প্যারামিটার হিসাবে বুট করুন , যেখানে /some/cmd
নতুন নামস্থান ( CLONE_NEWPID
) -তে একটি প্রক্রিয়া শুরু হয় /sbin/init
এবং এটি চালিত হয় (এটি নতুন নামস্থানে পিআইডি 1 এবং মূল নামস্থানে পিড 2 থাকবে), তারপরে পিতামাতার মধ্যে, আপনার চালনা করুন " কার্যক্রম".
আপনি সম্ভবত আপনার প্রোগ্রামটিকে কোনও উপায়ে বা অন্য কোনও উপায়ে নিয়ন্ত্রণের উপায় চাইবেন (উদাহরণস্বরূপ টিসিপি বা অ্যাবস্ট্রাক্ট ইউনিক্স সকেট)।
আপনি সম্ভবত মেমরিতে আপনার প্রোগ্রামটি মলক করতে এবং ফাইল সিস্টেমের সর্বাধিক উল্লেখগুলি বন্ধ করতে চান যাতে এটি কোনও কিছুর উপর নির্ভর করে না।
প্রক্রিয়াটি বাকি সিস্টেম থেকে দেখা যাবে না be সিস্টেমের বাকী অংশগুলি কার্যকরভাবে একটি পাত্রে চালিত হবে।
যদি সেই প্রক্রিয়াটি মারা যায়, কার্নেল আতঙ্কিত হবে যা আপনাকে অতিরিক্ত গ্যারান্টি দেয়।
কোনও অসুবিধাজনক পার্শ্ব-প্রতিক্রিয়া হ'ল আমরা এর আউটপুটে কার্নেল থ্রেড দেখতে পাচ্ছি না ps
।
ধারণার প্রমাণ হিসাবে ( একটি কেমু ভার্চুয়াল মেশিনে আপনার সিস্টেমের অনুলিপি বুট করার জন্য এই কৌশলটি ব্যবহার করে ):
একটি /tmp/init
মত তৈরি করুন :
#! /bin/sh -
echo Starting
/usr/local/bin/unshare -fmp -- sh -c '
umount /proc
mount -nt proc p /proc
exec bash <&2' &
ifconfig lo 127.1/8
exec socat tcp-listen:1234,fork,reuseaddr system:"ps -efH; echo still running"
(আপনার unshare
ইউজ-লিনাক্সের সাম্প্রতিক সংস্করণ (2.14) থেকে দরকার)। উপরে আমরা socat
"প্রোগ্রাম" হিসাবে ব্যবহার করছি যা কেবলমাত্র আউটপুট দিয়ে 1234 পোর্টে টিসিপি সংযোগগুলিতে উত্তর দেয় ps -efH
।
তারপরে আপনার ভিএম বুট করুন:
kvm -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
-m 1024 -fsdev local,id=r,path=/,security_model=none \
-device virtio-9p-pci,fsdev=r,mount_tag=r -nographic -append \
'root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/tmp/init rw'
তারপরে, আমরা দেখতে পাই:
Begin: Running /scripts/init-bottom ... done.
Starting
[...]
root@(none):/# ps -efH
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:24 ? 00:00:00 bash
root 4 1 0 14:24 ? 00:00:00 ps -efH
root@(none):/# telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 14:24 ? 00:00:00 [kthreadd]
root 3 2 0 14:24 ? 00:00:00 [ksoftirqd/0]
[...]
root 1 0 2 14:24 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 204 1 0 14:24 ? 00:00:00 /usr/local/bin/unshare -fmp -- sh -c umount /proc mount -nt proc p /proc exec bash <&2
root 206 204 0 14:24 ? 00:00:00 bash
root 212 206 0 14:25 ? 00:00:00 telnet localhost 1234
root 213 1 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 214 213 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 215 214 0 14:25 ? 00:00:00 sh -c ps -efH; echo still running
root 216 215 0 14:25 ? 00:00:00 ps -efH
still running
Connection closed by foreign host.
root@(none):/# QEMU: Terminated