xref: /qemu/tests/functional/test_linux_initrd.py (revision 8dcac1cf714da71e54e409253f6ebdc92ab97317)
1*8dcac1cfSThomas Huth#!/usr/bin/env python3
2*8dcac1cfSThomas Huth#
3bbbd9b6eSWillian Rampazzo# Linux initrd integration test.
482d4c923SWainer dos Santos Moschetta#
582d4c923SWainer dos Santos Moschetta# Copyright (c) 2018 Red Hat, Inc.
682d4c923SWainer dos Santos Moschetta#
782d4c923SWainer dos Santos Moschetta# Author:
882d4c923SWainer dos Santos Moschetta#  Wainer dos Santos Moschetta <wainersm@redhat.com>
982d4c923SWainer dos Santos Moschetta#
1082d4c923SWainer dos Santos Moschetta# This work is licensed under the terms of the GNU GPL, version 2 or
1182d4c923SWainer dos Santos Moschetta# later.  See the COPYING file in the top-level directory.
1282d4c923SWainer dos Santos Moschetta
133c1de3afSAlex Bennéeimport os
148f1c89ecSLi Zhijianimport logging
1582d4c923SWainer dos Santos Moschettaimport tempfile
1682d4c923SWainer dos Santos Moschetta
17*8dcac1cfSThomas Huthfrom qemu_test import QemuSystemTest, Asset
18*8dcac1cfSThomas Huthfrom unittest import skipUnless
1982d4c923SWainer dos Santos Moschetta
2082d4c923SWainer dos Santos Moschetta
212283b627SPhilippe Mathieu-Daudéclass LinuxInitrd(QemuSystemTest):
2282d4c923SWainer dos Santos Moschetta    """
2382d4c923SWainer dos Santos Moschetta    Checks QEMU evaluates correctly the initrd file passed as -initrd option.
2482d4c923SWainer dos Santos Moschetta    """
2582d4c923SWainer dos Santos Moschetta
268f1c89ecSLi Zhijian    timeout = 300
2782d4c923SWainer dos Santos Moschetta
28*8dcac1cfSThomas Huth    ASSET_F18_KERNEL = Asset(
29*8dcac1cfSThomas Huth        ('https://archives.fedoraproject.org/pub/archive/fedora/linux/'
30*8dcac1cfSThomas Huth         'releases/18/Fedora/x86_64/os/images/pxeboot/vmlinuz'),
31*8dcac1cfSThomas Huth        '1a27cb42559ce29237ac186699d063556ad69c8349d732bb1bd8d614e5a8cc2e')
32*8dcac1cfSThomas Huth
33*8dcac1cfSThomas Huth    ASSET_F28_KERNEL = Asset(
34*8dcac1cfSThomas Huth        ('https://archives.fedoraproject.org/pub/archive/fedora/linux/'
35*8dcac1cfSThomas Huth         'releases/28/Everything/x86_64/os/images/pxeboot/vmlinuz'),
36*8dcac1cfSThomas Huth        'd05909c9d4a742a6fcc84dcc0361009e4611769619cc187a07107579a035f24e')
37*8dcac1cfSThomas Huth
383c7156fdSLi Zhijian    def test_with_2gib_file_should_exit_error_msg_with_linux_v3_6(self):
3982d4c923SWainer dos Santos Moschetta        """
4082d4c923SWainer dos Santos Moschetta        Pretends to boot QEMU with an initrd file with size of 2GiB
4182d4c923SWainer dos Santos Moschetta        and expect it exits with error message.
423c7156fdSLi Zhijian        Fedora-18 shipped with linux-3.6 which have not supported xloadflags
433c7156fdSLi Zhijian        cannot support more than 2GiB initrd.
4482d4c923SWainer dos Santos Moschetta        """
45*8dcac1cfSThomas Huth        self.set_machine('pc')
46*8dcac1cfSThomas Huth        kernel_path = self.ASSET_F18_KERNEL.fetch()
4782d4c923SWainer dos Santos Moschetta        max_size = 2 * (1024 ** 3) - 1
4882d4c923SWainer dos Santos Moschetta
4982d4c923SWainer dos Santos Moschetta        with tempfile.NamedTemporaryFile() as initrd:
5082d4c923SWainer dos Santos Moschetta            initrd.seek(max_size)
5182d4c923SWainer dos Santos Moschetta            initrd.write(b'\0')
5282d4c923SWainer dos Santos Moschetta            initrd.flush()
53c80c6bebSWainer dos Santos Moschetta            self.vm.add_args('-kernel', kernel_path, '-initrd', initrd.name,
54c80c6bebSWainer dos Santos Moschetta                             '-m', '4096')
55c80c6bebSWainer dos Santos Moschetta            self.vm.set_qmp_monitor(enabled=False)
56c80c6bebSWainer dos Santos Moschetta            self.vm.launch()
57c80c6bebSWainer dos Santos Moschetta            self.vm.wait()
58c80c6bebSWainer dos Santos Moschetta            self.assertEqual(self.vm.exitcode(), 1)
5982d4c923SWainer dos Santos Moschetta            expected_msg = r'.*initrd is too large.*max: \d+, need %s.*' % (
6082d4c923SWainer dos Santos Moschetta                max_size + 1)
61c80c6bebSWainer dos Santos Moschetta            self.assertRegex(self.vm.get_log(), expected_msg)
628f1c89ecSLi Zhijian
639b45cc99SAlex Bennée    @skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
648f1c89ecSLi Zhijian    def test_with_2gib_file_should_work_with_linux_v4_16(self):
658f1c89ecSLi Zhijian        """
668f1c89ecSLi Zhijian        QEMU has supported up to 4 GiB initrd for recent kernel
678f1c89ecSLi Zhijian        Expect guest can reach 'Unpacking initramfs...'
688f1c89ecSLi Zhijian        """
69*8dcac1cfSThomas Huth        self.set_machine('pc')
70*8dcac1cfSThomas Huth        kernel_path = self.ASSET_F28_KERNEL.fetch()
718f1c89ecSLi Zhijian        max_size = 2 * (1024 ** 3) + 1
728f1c89ecSLi Zhijian
738f1c89ecSLi Zhijian        with tempfile.NamedTemporaryFile() as initrd:
748f1c89ecSLi Zhijian            initrd.seek(max_size)
758f1c89ecSLi Zhijian            initrd.write(b'\0')
768f1c89ecSLi Zhijian            initrd.flush()
778f1c89ecSLi Zhijian
788f1c89ecSLi Zhijian            self.vm.set_console()
798f1c89ecSLi Zhijian            kernel_command_line = 'console=ttyS0'
808f1c89ecSLi Zhijian            self.vm.add_args('-kernel', kernel_path,
818f1c89ecSLi Zhijian                             '-append', kernel_command_line,
828f1c89ecSLi Zhijian                             '-initrd', initrd.name,
838f1c89ecSLi Zhijian                             '-m', '5120')
848f1c89ecSLi Zhijian            self.vm.launch()
858f1c89ecSLi Zhijian            console = self.vm.console_socket.makefile()
868f1c89ecSLi Zhijian            console_logger = logging.getLogger('console')
878f1c89ecSLi Zhijian            while True:
888f1c89ecSLi Zhijian                msg = console.readline()
898f1c89ecSLi Zhijian                console_logger.debug(msg.strip())
908f1c89ecSLi Zhijian                if 'Unpacking initramfs...' in msg:
918f1c89ecSLi Zhijian                    break
928f1c89ecSLi Zhijian                if 'Kernel panic - not syncing' in msg:
938f1c89ecSLi Zhijian                    self.fail("Kernel panic reached")
94*8dcac1cfSThomas Huth
95*8dcac1cfSThomas Huthif __name__ == '__main__':
96*8dcac1cfSThomas Huth    QemuSystemTest.main()
97