VBoxLinuxAdditions.run никогда не завершает работу с 0

Я пытаюсь автоматизировать установку гостевых дополнений Virtualbox с помощью Chef, однако я сталкиваюсь с проблемой, когда VBoxLinuxAdditions.run никогда не существует с кодом выхода 0. Я всегда получаю код выхода 1, даже если об ошибках в распечатке сценариев не сообщается.

Кажется, что они устанавливаются, поэтому я не понимаю, почему этот скрипт всегда возвращает 1.

Я работаю на хосте Windows 8.1, Virtualbox 4.3.12 с гостевой ОС Debian 6.

Я пытаюсь сделать это, запустив следующий рецепт с использованием кухни:

include_recipe "apt"

%W[make gcc xserver-xorg xserver-xorg-core linux-headers-#{node['kernel']['release']} dkms].each do |p|
  package p do
    action :install
  end
end

# get additions iso file
remote_file "#{Chef::Config[:file_cache_path]}/vboxAdditions.iso" do
  source "http://download.virtualbox.org/virtualbox/#{node['virtualbox']['version']}/VBoxGuestAdditions_#{node['virtualbox']['version']}.iso"
end

# create the mount point
directory "/mnt/vboxAdditions" do
  owner "root"
  group "root"
  mode "0755"
  action :create
end

# mount the iso
mount "/mnt/vboxAdditions" do
  action :mount
  device "#{Chef::Config[:file_cache_path]}/vboxAdditions.iso"
fstype "iso9660"
  options "loop"
end

# run the installer script
execute "install vbox guest additions" do
  command "sh /mnt/vboxAdditions/VBoxLinuxAdditions.run"
end

Мой файл.kitchen.yml:

---
driver_plugin: vagrant

platforms:
- name: debian-6
  driver_config:
    box: opscode-debian-6.0.7
    box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_debian-6.0.7_chef-11.2.0.box
    require_chef_omnibus: 11.4.0

suites:

- name: guest_additions
  run_list: ["recipe[virtualbox::guest_additions]"]
  attributes: {
    "virtualbox": {
      "version": "4.3.12"
    }
  }

Ниже вывод, который я получаю:

       ================================================================================
       Error executing action `run` on resource 'execute[install vbox guest additions]'
       ================================================================================


       Mixlib::ShellOut::ShellCommandFailed
       ------------------------------------
       Expected process to exit with [0], but received '1'
       ---- Begin output of sh /mnt/vboxAdditions/VBoxLinuxAdditions.run ----
       STDOUT: Verifying archive integrity... All good.
       Uncompressing VirtualBox 4.3.12 Guest Additions for Linux............
       STDERR: VirtualBox Guest Additions installer
       Removing installed version 4.2.6 of VirtualBox Guest Additions...
       Copying additional installer modules ...
       add_symlink: link file /usr/lib/VBoxGuestAdditions already exists
       Installing additional modules ...
       Removing existing VirtualBox DKMS kernel modules ...done.
       Removing existing VirtualBox non-DKMS kernel modules ...done.
       Building the VirtualBox Guest Additions kernel modules ...done.
       Doing non-kernel setup of the Guest Additions ...done.
       Starting the VirtualBox Guest Additions ...done.
       Installing the Window System drivers
       Installing X.Org Server 1.7 modules ...done.
       Setting up the Window System to use the Guest Additions ...done.
       You may need to restart the hal service and the Window System (or just restart
       the guest system) to enable the Guest Additions.

       Installing graphics libraries and desktop services components ...done.
       ---- End output of sh /mnt/vboxAdditions/VBoxLinuxAdditions.run ----
       Ran sh /mnt/vboxAdditions/VBoxLinuxAdditions.run returned 1


       Resource Declaration:
       ---------------------
       # In /tmp/kitchen/cookbooks/virtualbox/recipes/guest_additions.rb

        70:   execute "install vbox guest additions" do
        71:     command "sh /mnt/vboxAdditions/VBoxLinuxAdditions.run"
        72:   end
        73:



       Compiled Resource:
       ------------------
       # Declared in /tmp/kitchen/cookbooks/virtualbox/recipes/guest_additions.rb:70:in `from_file'

       execute("install vbox guest additions") do
         action "run"
         retries 0
         retry_delay 2
         command "sh /mnt/vboxAdditions/VBoxLinuxAdditions.run"
         backup 5
         returns 0
         cookbook_name :virtualbox
         recipe_name "guest_additions"
       end



       [2014-08-21T19:34:55+00:00] INFO: Running queued delayed notifications before re-raising exception
       [2014-08-21T19:34:55+00:00] ERROR: Running exception handlers
       [2014-08-21T19:34:55+00:00] ERROR: Exception handlers complete
       Chef Client failed. 14 resources updated
       [2014-08-21T19:34:55+00:00] FATAL: Stacktrace dumped to /tmp/kitchen/cache/chef-stacktrace.out
       [2014-08-21T19:34:55+00:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: execute[install vbox guest additions] (virtualbox::guest_additions line 70) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
       ---- Begin output of sh /mnt/vboxAdditions/VBoxLinuxAdditions.run ----
       STDOUT: Verifying archive integrity... All good.
       Uncompressing VirtualBox 4.3.12 Guest Additions for Linux............
       STDERR: VirtualBox Guest Additions installer
       Removing installed version 4.2.6 of VirtualBox Guest Additions...
       Copying additional installer modules ...
       add_symlink: link file /usr/lib/VBoxGuestAdditions already exists
       Installing additional modules ...
       Removing existing VirtualBox DKMS kernel modules ...done.
       Removing existing VirtualBox non-DKMS kernel modules ...done.
       Building the VirtualBox Guest Additions kernel modules ...done.
       Doing non-kernel setup of the Guest Additions ...done.
       Starting the VirtualBox Guest Additions ...done.
       Installing the Window System drivers
       Installing X.Org Server 1.7 modules ...done.
       Setting up the Window System to use the Guest Additions ...done.
       You may need to restart the hal service and the Window System (or just restart
       the guest system) to enable the Guest Additions.

       Installing graphics libraries and desktop services components ...done.
       ---- End output of sh /mnt/vboxAdditions/VBoxLinuxAdditions.run ----
       Ran sh /mnt/vboxAdditions/VBoxLinuxAdditions.run returned 1
>>>>>> Converge failed on instance <guest-additions-debian-6>.
>>>>>> Please see .kitchen/logs/guest-additions-debian-6.log for more details
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json  --log_level info]
>>>>>> ----------------------
bash.exe"-3.1$

4 ответа

Решение

Я использую 4.3.16 в Linux и столкнулся с той же проблемой. Моя установка также встроена в автоматизированный процесс.

Вы можете распаковать архив для проверки файлов с

./VBoxLinuxAdditions.run --target foo --noexec

Неприятный и бесполезный кусок кода, который вызывает проблему, находится в install.sh, начинается здесь:

test ! -d "$INSTALLATION_DIR" && REMOVE_INSTALLATION_DIR=1

(REMOVE_INSTALLATION_DIR никогда не устанавливается в 1, несмотря на то, существует или нет $INSTALLATION_DIR).

Ошибка в конце файла такова:

test -n "$REMOVE_INSTALLATION_DIR" &&
    echo "$INSTALLATION_DIR/" >> "$CONFIG_DIR/$CONFIG_FILES"

Так как $REMOVE_INSTALLATION_DIR никогда не устанавливается, test -n возвращает 1 (сбой), и вместо предоставления выхода 0 в конце сценария установки, как должен иметь автор, он сбрасывается с конца и передает последний код выхода оболочке,

Успешное решение:

# REMOVE_INSTALLATION_DIR=0 ./VBoxLinuxAdditions.run
# echo $?
0

Продолжение метода Виктора Рётмана, позволяющего избежать некоторых проблем с путями:

if ! modinfo vboxsf >/dev/null 2>&1; then
  echo "Cannot find vbox kernel module. Installation of guest additions unsuccessful!"
  exit 1
fi

Я могу подтвердить, что проблема все еще существует в install.sh скрипт для версии 5.0.4 - и что обходной путь Дерека все еще хорош. Я включил соответствующие фрагменты в пример кода ниже:

27  PACKAGE="VBoxGuestAdditions"
...
32  INSTALLATION_VER="5.0.4"
33  INSTALLATION_REV="102546"
...
38  INSTALLATION_DIR="/opt/$PACKAGE-$INSTALLATION_VER"
...
324 INSTALLATION_MODULES_DIR="$INSTALLATION_DIR/installer/"
...
329 mkdir -p -m 755 "$INSTALLATION_MODULES_DIR"
...
343 test ! -d "$INSTALLATION_DIR" && REMOVE_INSTALLATION_DIR=1
344 mkdir -p -m 755 "$INSTALLATION_DIR"
...
531 test -n "$REMOVE_INSTALLATION_DIR" &&
532   echo "$INSTALLATION_DIR/" >> "$CONFIG_DIR/$CONFIG/FILES"

REMOVE_INSTALLATION_DIR никогда не будет установлен на 1 в строке 343, потому что INSTALLATION_DIR создается (как родительский каталог) для INSTALLATION_MODULES_DIR по линии 329.

Даже с гостевыми дополнениями VirtualBox 5.0 я нахожу код возврата VBoxLinuxAdditions.run совершенно ненадежным. Например, если я удаляю gcc из коробки и запускаю с

REMOVE_INSTALLATION_DIR=0 ./VBoxLinuxAdditions.run

как указано в другом ответе, он не сможет построить, но все равно даст код возврата 0.

Мое решение - проверить, были ли построены модули ядра. Итак, я запускаю это так:

/location/of/VBoxLinuxAdditions.run || true

if ! test -f /lib/modules/$(uname -r)/extra/vboxsf.ko
then
  echo "installation of guest additions unsuccessful"
  exit 1
fi

Я попробовал решение Дерека, но оно не сработало. Я пишу сценарии создания виртуальных машин с помощью упаковщика vagrant. Я сделал следующее:

echo "sudo /path/to/installer/VBoxLinuxAdditions.run" > /tmp/install_va.sh
/bin/bash /tmp/install_va.sh
sudo /usr/sbin/VBoxService --version

Таким образом, ложный результат ошибки (который в моем случае заставлял упаковщика Vagrant уничтожить ВМ) будет происходить в подпроцессе и не перехватываться в текущем процессе. Результат последней операции будет результатом скрипта. Если при последней проверке произошла ошибка, в установке произошла ошибка.

Другие вопросы по тегам