হোস্ট পুনরায় বুটে নিরাপদে ভার্চুয়ালবক্স মেশিনটি বন্ধ করুন


8

আমি উবুন্টু ১১.১০-তে ভার্চুয়ালবক্সের ভিতরে উইন্ডোজ running চালাচ্ছি। সবকিছু ঠিকঠাক কাজ করে। আমি এটি শুরুতে চালিয়ে যাচ্ছি, তবে রিবুট করতে আমার সমস্যা আছে।

আমি যখন sudo reboot nowভার্চুয়াল উইন্ডোজ 7 এর স্টেট টাইপ করি তখন সেভ হয় না। রিবুট করার পরে ভার্চুয়ালবক্স শুরু হয়ে যায়, তবে চলমান উইন্ডোজের পরিবর্তে আমি উইন্ডোজটির 7 ক্র্যাশ বুট মেনুটি পাই এবং উইন্ডোজগুলি আবার বুট শুরু করে।

হোস্ট পুনরায় বুট করার আগে উবুন্টু ভার্চুয়াল বক্সে নিরাপদে উদাহরণটি বন্ধ করার জন্য কিছু সংকেত পাঠাতে পারে এমন কোনও বিকল্প রয়েছে কি?

উত্তর:


6

ভার্চুয়াল বাক্সে ভার্চুয়াল মেশিন চলার সময় আপনার যদি সত্যিই শাটডাউন করার প্রয়োজন হয় আপনি শাটডাউন প্রক্রিয়া শুরুর আগে মেশিন স্টেটটি সংরক্ষণ করার জন্য একটি কমান্ড স্থাপন করে ম্যানুয়াল শাটডাউন করার জন্য নিজের স্ক্রিপ্টটি সংজ্ঞায়িত করতে পারেন:

VBoxManage controlvm <name> savestate # <name> is the name of your VM
gnome-session-quit --power-off # this example displays the power-off dialog for >11.10

বিকল্পভাবে আপনি এমন স্ক্রিপ্টও তৈরি করতে পারেন যা সর্বদা শাটডাউনে চালিত হয়


4

আপনি যদি sudo rebootপ্রোগ্রামগুলি ব্যবহার করেন তবে কিল সিগন্যাল দেওয়া হয় এ জাতীয় পরিস্থিতিতে কোনও অ্যাপ্লিকেশন সময় না দিয়ে স্বয়ংক্রিয়ভাবে এগুলি শেষ করে। এটি কোনও বাগ নয়, এটি সর্বদা একইভাবে কাজ করেছে এবং এটি প্রত্যাশিত আচরণ।

একটি অনুরূপ প্রশ্ন যেখানে আপনি দেখতে পারেন ব্যক্তিদের কোন কমান্ড দেওয়া হয় নেই যখন আপনি টিপুন shutdown, reboot, suspend, ইত্যাদি ব্যবহারকারী মেনু বোতাম, এই ধরনের সমাধান আপনি জিজ্ঞেস করা উচিত যখন একটি চলমান অ্যাপ্লিকেশন এবং তার বাঞ্ছনীয় সঙ্গে একটি উইন্ডো বন্ধ করতে চেষ্টা কি করতে (ইন আপনার ক্ষেত্রে) sudo shutdownপদ্ধতির। একবার দেখুন


রিবুট কি সম্প্রতি আরও ভদ্র হয়ে উঠেছে? reboot১২.১০- র ম্যান পেজটিতে বলা হয়েছে "যখন - ফোর্স যুক্ত হয় বা যখন রানলেভেল ০ বা in হয়, তখন এই সরঞ্জামটি রিবুট (২) সিস্টেম নিজে কল করে এবং সরাসরি সিস্টেমটিকে রিবুট করে Otherwise অন্যথায় এটি কেবল শাটডাউন (8) সরঞ্জামটির সাথে অনুরোধ করে উপযুক্ত যুক্তি ""; এবং ম্যান shutdownপেজটির জন্য "একবার টাইম সময় অতিবাহিত হয়ে গেলে, শাটডাউনটি সিস্টেমটিকে উপযুক্ত রানলেলে নামিয়ে আনার জন্য (8) ডিমনকে একটি অনুরোধ প্রেরণ করে।"
ইক্রিস্টোফারসন

4

আমি একটি আপস্টার্ট কাজ, একটি শুরু এবং স্টপ স্ক্রিপ্ট সহ আরও পরিশীলিত পদ্ধতির প্রস্তাব করব। উদাহরণস্বরূপ আমি উইন্ডোজ এক্সপি ব্যবহার করছি, যেমন আমার হোম ডিরেক্টরিটি টমবার্ট ব্যবহার করতে দেয় ... যা আপনার সেই অনুযায়ী পরিবর্তন করা উচিত। আপনি যা কিছু করেন তার সুবিধা রয়েছে (রিবুট, শাটডাউন, পাওয়ার বোতাম টিপানো) এটি আপনার ভার্চুয়াল মেশিনটিকে দুর্দান্তভাবে পরিচালনা করে

প্রথমে আপস্টার্ট কাজ, /etc/init/winxpvm.conf- এ রাখুন:

description "WinXP VirtualBox job"
author "Thomas Perschak"

## 0: system halt
## 1: single-user mode
## 2: graphical multi-user plus networking
## 6: system reboot
start on started rc RUNLEVEL=[2]
stop on starting rc RUNLEVEL=[!2]

## upstart config
kill timeout 120
kill signal SIGCONT
nice -10

## start WinXP VirtualBox
exec /home/tombert/scripts/winxpvm-start.sh

## stop WinXP VirtualBox
pre-stop exec /home/tombert/scripts/winxpvm-stop.sh

আপস্টার্ট কাজটি রানলেভেল 2 (যা গ্রাফিকাল মোডে রয়েছে) এ ভার্চুয়াল মেশিন শুরু করে, এবং আমার ক্ষেত্রে এটি অগ্রাধিকারটি বৃদ্ধি করে nice। ভার্চুয়াল মেশিনটি সুন্দরভাবে বন্ধ করার জন্য আমার kill signal SIGCONTবিবৃতিটি ব্যবহার করে আপস্টার্ট সমাপ্তি "অক্ষম" করতে হবে । এটি ভার্চুয়াল মেশিনটিকে প্রথমে চলতে দেয় (ডিফল্ট এড়ানো SIGTERM)। 120 সেকেন্ড পরে SIGKILLযেকোন উপায়ে প্রেরণ করা হয়। পরিবর্তে আমি winxpvm-stop.shস্ক্রিপ্ট চালাচ্ছি ।

সাইড-নোট 1: স্তবকগুলি start on started runlevel [2]এবং stop on starting runlevel [!2]কাজ করে না। একটি নির্দিষ্টভাবে কাজ উল্লেখ করতে হবে rc

পার্শ্ব-নোট 2: আপস্টার্ট ম্যানুয়াল থেকে কী বিভ্রান্ত করছে: kill signalস্তবকটি 5 সেকেন্ডের পরে প্রেরিত সিগন্যালটি নির্দিষ্ট করে। এই উদাহরণে আমি এটি SIGTERM(ডিফল্ট) থেকে সিগকন্টে সেট করেছি - তবে 5 সেকেন্ডের সময়সীমাটি আমি পরিবর্তন করতে পারিনি। kill timeoutস্তবক সময়সীমার পরে যা নির্দিষ্ট করে SIGKILLযা সংকেত একটিকে পরিবর্তন করতে পারবেন না - পাঠানো হয়। উন্নতি হ'ল নতুন স্তব term signalএবং সংজ্ঞা দেওয়া হবে term timeout

এখানে শুরু স্ক্রিপ্ট winxpvm-start.sh:

#! /bin/bash -e

function dostart()
{
    echo -n "Running WinXP ... "
    vboxheadless --startvm WinXP
    echo "now closed"
}
export -f dostart

if [ $(whoami) != "tombert" ]; then
    su -c dostart tombert
else
    dostart
fi

যেহেতু সব সেটিংস ইত্যাদি ব্যবহারকারী মোড মধ্যে সম্পন্ন করা হয় (আমার লগইন হল tombert ), এমনকি যখন রুট হিসাবে চালাতে আমি অ্যাকাউন্ট পরিবর্তন tombert । অবশ্যই ব্যবহারকারী আপস্টার্ট কনফিগারেশনে পরিবর্তন করা যেতে পারে তবে এই সমাধানটি কনসোল থেকে ভার্চুয়াল মেশিনটি "হাত ধরে" শুরু / বন্ধ করার বিকল্প ছেড়ে দেয়।

আরও আকর্ষণীয় হ'ল winxpvm-stop.sh এর শাটডাউন স্ক্রিপ্ট:

#! /bin/bash

function dostop()
{
    ## check if WinXP is running
    vboxmanage showvminfo WinXP --machinereadable | grep -q 'VMState="running"' &> /dev/null
    if [ $? -ne 0 ]; then
        echo "WinXP not running"
        exit
    fi
    ## try gracefully shutdown
    echo -n "Shutting down WinXP ... "
    #vboxmanage controlvm WinXP acpipowerbutton
    vboxmanage guestcontrol WinXP execute --image "%SystemRoot%\system32\shutdown.exe" --username tombert --password <mypassword> --wait-exit -- "-s" "-f" "-t" "0" &> /dev/null
    ## check vm status
    INDEX=60
    while [ $INDEX -gt 0 ]; do
        echo -n "$INDEX "
        vboxmanage showvminfo WinXP --machinereadable | grep -q 'VMState="running"' &> /dev/null
        if [ $? -ne 0 ]; then
            echo "gracefully done"
            break
        fi
        sleep 1
        let INDEX+=-1
    done
    ## close forcefully
    if [ $INDEX -eq 0 ]; then
        vboxmanage controlvm WinXP poweroff &> /dev/null
        echo "forcefully done"
    fi
}
export -f dostop

if [ $(whoami) != "tombert" ]; then
    su -c dostop tombert
else
    dostop
fi

প্রথমে আমি শুরু স্ক্রিপ্টের মতোই করি - আমি ব্যবহারকারীকে মূল থেকে আমার অ্যাকাউন্ট টমবার্টে পরিবর্তন করছি । এখন ফাংশনটি দেখতে দিন dostop। প্রথমে আমি যাচ্ছি যে ভার্চুয়াল মেশিনটি এমনকি চলমান কিনা even তারপরে আমি সরাসরি উইনএক্সপি ব্যবহার করে একটি শাটডাউন প্রেরণ করে "নরমভাবে" শাটডাউন করার চেষ্টা করছি guestcontrol। এখানে আপনাকে অবশ্যই WinXP অ্যাকাউন্টের শংসাপত্রাদি সরবরাহ করতে হবে, আমার ক্ষেত্রে টমবার্ট এবং একটি পাসওয়ার্ড। উইন্ডোজ shutdownকৌতূহলীভাবে সমস্ত অ্যাপ্লিকেশন বন্ধ করবে এবং অপারেটিং সিস্টেমটি (সাধারণত) বন্ধ করে দেবে। তারপর একটানা ভার্চুয়াল মেশিন অবস্থা পরীক্ষা করুন ব্যবহার করতে দেয় showvminfo। 1 সেকেন্ড টাইমআউট দিয়ে কমপক্ষে 60 বার এটি করার (আপনি যা মনে করেন অ্যাপ্রোপিয়েট এখানে রয়েছে তা করুন) ভার্চুয়াল মেশিনটিকে নিখুঁতভাবে বন্ধ করার জন্য যথেষ্ট সময় দেওয়া উচিত। নোট করুন যে কলshowvminfoএছাড়াও একটি সেকেন্ডের চেয়ে কিছুটা কম সময় নেয় (কমপক্ষে আমার কম্পিউটারে) সুতরাং এটি আমার ক্ষেত্রে এটি ~ 120 সেকেন্ড দেয়। সবকিছু ব্রেক হলে আমরা poweroffস্টেটমেন্টটি ব্যবহার করে জোর করে শাটডাউন করতে পারি ।

acpipowerbuttonআপনারও দেখতে হবে তবে অব্যবহৃত। এটি নির্ভরযোগ্য কাজ করে না কারণ এটি। আপনি যদি উইন্ডোজে লগইন হয়ে থাকেন, বা আরও খারাপ একাধিক ব্যবহারকারী, উইন্ডোজ সিস্টেমটিকে শাটডাউন থেকে রোধ করে একটি নিশ্চিতকরণ শাটডাউন ডায়ালগ প্রদর্শন করবে। এটি এই কারণে যে ইন- acpibuttonইন /etc/default/virtualbox100% নির্ভরযোগ্য কাজ করবে না। এছাড়াও poweroffইচ্ছাশক্তি ভার্চুয়াল মেশিনটি শক্তভাবে শাটডাউন করবে - একটি দীর্ঘ-প্রেস পাওয়ার বোতামের মতো। সুতরাং এটি খালি সেট করা ভাল:

/ ইত্যাদি / ডিফল্ট / ভার্চুয়ালবক্স থেকে অংশ:

# SHUTDOWN_USERS="foo bar"  
#   check for running VMs of user 'foo' and user 'bar'
#   'all' checks for all active users
# SHUTDOWN=poweroff
# SHUTDOWN=acpibutton
# SHUTDOWN=savestate
#   select one of these shutdown methods for running VMs
#   acpibutton and savestate causes the init script to wait
#   30 seconds for the VMs to shutdown
SHUTDOWN_USERS=""
SHUTDOWN=""

এটিকে নিখুঁত করতে আপনি পাওয়ার বোতামের আচরণটি পরিবর্তন করতে চাইতে পারেন:

/Etc/acpi/powerbtn.sh এর উদ্ধৃতি:

#!/bin/sh
# /etc/acpi/powerbtn.sh
# Initiates a shutdown when the power putton has been
# pressed.

# @backup
# plain shutdown
/sbin/shutdown -h now "Power button pressed"

# fini
exit 0
...
...

একটি ছোট্ট অপূর্ণতা বাকি আছে। ভার্চুয়াল মেশিনটি এখনও বুট করার সময় এবং অতিথি নিয়ন্ত্রণ পরিষেবাটি চালু না হলে (ভার্চুয়াল মেশিনে) এটি শাটডাউন কমান্ডটি গ্রহণ করবে না। একটি বিরল ঘটনা ... তবে এটি সম্পর্কে চিন্তা করুন।

আশা করি এটি সাহায্য করবে it


, একটি কবজ (উইন্ডোজ এক্সপি অতিথি) মত কাজ করে ছাড়া এটি একটি বর্জন বলে মনে হয় VERR_INVALID_PARAMETERহোস্ট পাশ যদি আমি স্ক্রিপ্ট দেওয়া ব্যবহারকারী হিসাবে RDC মাধ্যমে লগ ইন করতে থাকি, এবং পরবর্তীকালে অতিথি চলমান রাখে।
ইক্রিস্টোফারসন

আমি দু'জনের সাথে নেটিভ আরডিসি এবং ভার্চুয়ালবক্সের শীর্ষে আরডিসি দিয়ে চেষ্টা করেছি। এরকম কোনও ত্রুটি নেই। সম্ভবত
ভার্চুয়ালবক্স.অর্গ

2

রিবুট করার জন্য আপনার সিস্টেমের নীতি পরিবর্তন করতে এই উত্তরটি অনুসরণ করুন

আপনি এটিকে প্রবাহিত করতে পারবেন না reboot। আফাইক init.dস্ক্রিপ্টগুলি কাজ করবে না কারণ এটি অনেক বেশি সময় নেয় তবে আপনি কমান্ডটি এভাবে চালাতে পারেন:

VBoxManage controlvm <vm> savestate&&reboot

<vm>ভার্চুয়াল মেশিনের নাম কোথায়


1

আপনি এইটির সাথে ভার্চুয়াল মেশিনে শাটডাউন অনুরোধ পাঠাতে পারেন:

VBoxManage controlvm <vm_name> acpipowerbutton

তবে আপনি যদি এটি কোনও init স্ক্রিপ্টে করেন তবে শাটডাউনটি শেষ না হওয়া অবধি স্ক্রিপ্টটি প্রস্থান করা উচিত নয়। আমরা লুপের সাথে lsofবা fuserলুপের মাধ্যমে ভিএম এর ড্রাইভ ফাইল (.vdi) পোলিং করে এটি সনাক্ত করতে সক্ষম হতে পারি । বা একটি সস্তা কাজের হিসাবে sleep 20যথেষ্ট হতে পারে।

আমি বর্তমানে আমার আরআর স্ক্রিপ্টের ঘনিষ্ঠ ব্লকে এটি ব্যবহার করছি:

# This always returns 0, even if an error is displayed!
su - "$DAEMONUSER" VBoxManage controlvm "$VMNAME" acpipowerbutton

# Wait until the disk file is no longer open...
for attempt in `seq 1 20`
do
    fuser "$VMDISKIMAGE" >/dev/null 2>&1 || break
    sleep 2
done

return 0    # A better script would return success/fail

আমি সংজ্ঞায়িত ফাইলের শীর্ষের নিকটে:

VMDISKIMAGE="/home/$DAEMONUSER/VirtualBox VMs/$VMNAME/$VMNAME.vdi"

এটি প্রকৃতপক্ষে ভার্চুয়ালবক্স অ্যাপ্লিকেশনটি বন্ধ নাও করতে পারে তবে এটি ভিএম বন্ধ হয়ে যাওয়ার জন্য অপেক্ষা করে না। এছাড়াও ভার্চুয়াল মেশিনটি বুট করার প্রক্রিয়া চলতে থাকলে (অনেক অপারেটিং সিস্টেম এই পর্যায়ে পাওয়ার-অফ বোতামটি উপেক্ষা করে), বা আপনি যদি কোনও এসিপিআই সমর্থন না করে কোনও পুরানো সিস্টেম অনুকরণ করছেন তবে এটি কার্যকর হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.