xref: /qemu/tests/functional/test_linux_initrd.py (revision 9b45cc9931866cedbe46d4372329074595267bfa)
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
152283b627SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest
16*9b45cc99SAlex Bennéefrom avocado import skipUnless
1782d4c923SWainer dos Santos Moschetta
1882d4c923SWainer dos Santos Moschetta
192283b627SPhilippe 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
56*9b45cc99SAlex Bennée    @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
57*9b45cc99SAlex Bennée
588f1c89ecSLi Zhijian    def test_with_2gib_file_should_work_with_linux_v4_16(self):
598f1c89ecSLi Zhijian        """
608f1c89ecSLi Zhijian        QEMU has supported up to 4 GiB initrd for recent kernel
618f1c89ecSLi Zhijian        Expect guest can reach 'Unpacking initramfs...'
628f1c89ecSLi Zhijian        """
6393bbbdf6SCleber Rosa        kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora'
6493bbbdf6SCleber Rosa                      '/linux/releases/28/Everything/x86_64/os/images/pxeboot/'
6593bbbdf6SCleber Rosa                      'vmlinuz')
668f1c89ecSLi Zhijian        kernel_hash = '238e083e114c48200f80d889f7e32eeb2793e02a'
678f1c89ecSLi Zhijian        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
688f1c89ecSLi Zhijian        max_size = 2 * (1024 ** 3) + 1
698f1c89ecSLi Zhijian
708f1c89ecSLi Zhijian        with tempfile.NamedTemporaryFile() as initrd:
718f1c89ecSLi Zhijian            initrd.seek(max_size)
728f1c89ecSLi Zhijian            initrd.write(b'\0')
738f1c89ecSLi Zhijian            initrd.flush()
748f1c89ecSLi Zhijian
758f1c89ecSLi Zhijian            self.vm.set_console()
768f1c89ecSLi Zhijian            kernel_command_line = 'console=ttyS0'
778f1c89ecSLi Zhijian            self.vm.add_args('-kernel', kernel_path,
788f1c89ecSLi Zhijian                             '-append', kernel_command_line,
798f1c89ecSLi Zhijian                             '-initrd', initrd.name,
808f1c89ecSLi Zhijian                             '-m', '5120')
818f1c89ecSLi Zhijian            self.vm.launch()
828f1c89ecSLi Zhijian            console = self.vm.console_socket.makefile()
838f1c89ecSLi Zhijian            console_logger = logging.getLogger('console')
848f1c89ecSLi Zhijian            while True:
858f1c89ecSLi Zhijian                msg = console.readline()
868f1c89ecSLi Zhijian                console_logger.debug(msg.strip())
878f1c89ecSLi Zhijian                if 'Unpacking initramfs...' in msg:
888f1c89ecSLi Zhijian                    break
898f1c89ecSLi Zhijian                if 'Kernel panic - not syncing' in msg:
908f1c89ecSLi Zhijian                    self.fail("Kernel panic reached")
91