xref: /qemu/tests/functional/test_linux_initrd.py (revision 2283b627bc6ba2bc7f120b4e7af0e43503282bb7)
1bbbd9b6eSWillian Rampazzo# Linux initrd integration test.
282d4c923SWainer dos Santos Moschetta#
382d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc.
482d4c923SWainer dos Santos Moschetta#
582d4c923SWainer dos Santos Moschetta# Author:
682d4c923SWainer dos Santos Moschetta#  Wainer dos Santos Moschetta <wainersm@redhat.com>
782d4c923SWainer dos Santos Moschetta#
882d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or
982d4c923SWainer dos Santos Moschetta# later.  See the COPYING file in the top-level directory.
1082d4c923SWainer dos Santos Moschetta
113c1de3afSAlex Bennéeimport os
128f1c89ecSLi Zhijianimport logging
1382d4c923SWainer dos Santos Moschettaimport tempfile
1482d4c923SWainer dos Santos Moschetta
15*2283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest
163c1de3afSAlex Bennéefrom avocado import skipIf
1782d4c923SWainer dos Santos Moschetta
1882d4c923SWainer dos Santos Moschetta
19*2283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest):
2082d4c923SWainer dos Santos Moschetta    """
2182d4c923SWainer dos Santos Moschetta    Checks QEMU evaluates correctly the initrd file passed as -initrd option.
2282d4c923SWainer dos Santos Moschetta
23b194713fSCleber Rosa    :avocado: tags=arch:x86_64
24ba21bde9SCleber Rosa    :avocado: tags=machine:pc
2582d4c923SWainer dos Santos Moschetta    """
2682d4c923SWainer dos Santos Moschetta
278f1c89ecSLi Zhijian    timeout = 300
2882d4c923SWainer dos Santos Moschetta
293c7156fdSLi Zhijian    def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self):
3082d4c923SWainer dos Santos Moschetta        """
3182d4c923SWainer dos Santos Moschetta        Pretends to boot QEMU with an initrd file with size of 2GiB
3282d4c923SWainer dos Santos Moschetta        and expect it exits with error message.
333c7156fdSLi Zhijian        Fedora-18 shipped with linux-3.6 which have not supported xloadflags
343c7156fdSLi Zhijian        cannot support more than 2GiB initrd.
3582d4c923SWainer dos Santos Moschetta        """
363c7156fdSLi Zhijian        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora/li'
373c7156fdSLi Zhijian                      'nux/releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz')
383c7156fdSLi Zhijian        kernel_hash = '41464f68efe42b9991250bed86c7081d2ccdbb21'
3982d4c923SWainer dos Santos Moschetta        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
4082d4c923SWainer dos Santos Moschetta        max_size = 2 * (1024 ** 3) - 1
4182d4c923SWainer dos Santos Moschetta
4282d4c923SWainer dos Santos Moschetta        with tempfile.NamedTemporaryFile() as initrd:
4382d4c923SWainer dos Santos Moschetta            initrd.seek(max_size)
4482d4c923SWainer dos Santos Moschetta            initrd.write(b'\0')
4582d4c923SWainer dos Santos Moschetta            initrd.flush()
46c80c6bebSWainer dos Santos Moschetta            self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name,
47c80c6bebSWainer dos Santos Moschetta                             '-m', '4096')
48c80c6bebSWainer dos Santos Moschetta            self.vm.set_qmp_monitor(enabled=False)
49c80c6bebSWainer dos Santos Moschetta            self.vm.launch()
50c80c6bebSWainer dos Santos Moschetta            self.vm.wait()
51c80c6bebSWainer dos Santos Moschetta            self.assertEqual(self.vm.exitcode(), 1)
5282d4c923SWainer dos Santos Moschetta            expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % (
5382d4c923SWainer dos Santos Moschetta                max_size + 1)
54c80c6bebSWainer dos Santos Moschetta            self.assertRegex(self.vm.get_log(), expected_msg)
558f1c89ecSLi Zhijian
563c1de3afSAlex Bennée    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
578f1c89ecSLi Zhijian    def test_with_2gib_file_should_work_with_linux_v4_16(self):
588f1c89ecSLi Zhijian        """
598f1c89ecSLi Zhijian        QEMU has supported up to 4 GiB initrd for recent kernel
608f1c89ecSLi Zhijian        Expect guest can reach 'Unpacking initramfs...'
618f1c89ecSLi Zhijian        """
6293bbbdf6SCleber Rosa        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
6393bbbdf6SCleber Rosa                      '/linux/releases/28/Everything/x86_64/os/images/pxeboot/'
6493bbbdf6SCleber Rosa                      'vmlinuz')
658f1c89ecSLi Zhijian        kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a'
668f1c89ecSLi Zhijian        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
678f1c89ecSLi Zhijian        max_size = 2 * (1024 ** 3) + 1
688f1c89ecSLi Zhijian
698f1c89ecSLi Zhijian        with tempfile.NamedTemporaryFile() as initrd:
708f1c89ecSLi Zhijian            initrd.seek(max_size)
718f1c89ecSLi Zhijian            initrd.write(b'\0')
728f1c89ecSLi Zhijian            initrd.flush()
738f1c89ecSLi Zhijian
748f1c89ecSLi Zhijian            self.vm.set_console()
758f1c89ecSLi Zhijian            kernel_command_line = 'console=ttyS0'
768f1c89ecSLi Zhijian            self.vm.add_args('-kernel', kernel_path,
778f1c89ecSLi Zhijian                             '-append', kernel_command_line,
788f1c89ecSLi Zhijian                             '-initrd', initrd.name,
798f1c89ecSLi Zhijian                             '-m', '5120')
808f1c89ecSLi Zhijian            self.vm.launch()
818f1c89ecSLi Zhijian            console = self.vm.console_socket.makefile()
828f1c89ecSLi Zhijian            console_logger = logging.getLogger('console')
838f1c89ecSLi Zhijian            while True:
848f1c89ecSLi Zhijian                msg = console.readline()
858f1c89ecSLi Zhijian                console_logger.debug(msg.strip())
868f1c89ecSLi Zhijian                if 'Unpacking initramfs...' in msg:
878f1c89ecSLi Zhijian                    break
888f1c89ecSLi Zhijian                if 'Kernel panic - not syncing' in msg:
898f1c89ecSLi Zhijian                    self.fail("Kernel panic reached")
90