{"id":49,"date":"2025-10-22T18:18:15","date_gmt":"2025-10-23T02:18:15","guid":{"rendered":"https:\/\/www.demaria.net\/?p=49"},"modified":"2025-10-23T18:39:39","modified_gmt":"2025-10-24T02:39:39","slug":"how-to-upgrade-junos-in-a-mixed-ex4300-4600-stack","status":"publish","type":"post","link":"https:\/\/www.demaria.net\/?p=49","title":{"rendered":"How-To: Upgrade JunOS in a Mixed EX4300\/4600 Stack"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"286\" src=\"https:\/\/www.demaria.net\/wp-content\/uploads\/2025\/10\/EX-SERIES-EX4300-48T_71f03490-80f1-42cd-9401-a9855cb1f4c3-copy.jpg\" alt=\"\" class=\"wp-image-50\" style=\"width:813px;height:auto\" srcset=\"https:\/\/www.demaria.net\/wp-content\/uploads\/2025\/10\/EX-SERIES-EX4300-48T_71f03490-80f1-42cd-9401-a9855cb1f4c3-copy.jpg 897w, https:\/\/www.demaria.net\/wp-content\/uploads\/2025\/10\/EX-SERIES-EX4300-48T_71f03490-80f1-42cd-9401-a9855cb1f4c3-copy-300x96.jpg 300w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">This tutorial is a reminder how to do something I perform once a year. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Requirements:<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>a USB drive formatted to fat32<\/li>\n\n\n\n<li>matching firmware for the devices. (currently 21.4R3-S11.3 as of 10\/25) \n<ul class=\"wp-block-list\">\n<li>Sub-note, always use an Junos SR release if you want stable. <\/li>\n\n\n\n<li>Only use R tagged release if you can except broekn stuf everywhere.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>a serial connection to the primary routing instance\/chassis master\n<ul class=\"wp-block-list\">\n<li>To determine this run &#8220;show chassis hardware&#8221; and look for <em>Chassis TC2607134532 Virtual Chassis<\/em><\/li>\n\n\n\n<li>I&#8217;m using ser2net on a raspberry pi connected with ttyUSB connected to the console port on my primary EX4600. this is wonderful. <\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Steps:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>First off, take a config backup! <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;<em><code>show configuration | save &lt;filename&gt;<\/code><\/em>&#8220;. For example &#8220;<em><code>show configuration | save <\/code>\/mnt\/config-backup-date.txt<\/em>&#8220;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Read this Juniper support document.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/supportportal.juniper.net\/s\/article\/Example-Install-software-on-a-Mixed-Mode-Virtual-Chassis-for-EX4300-EX4600-QFX5100-EX4300-and-EX4200-EX45XX\">https:\/\/supportportal.juniper.net\/s\/article\/Example-Install-software-on-a-Mixed-Mode-Virtual-Chassis-for-EX4300-EX4600-QFX5100-EX4300-and-EX4200-EX45XX<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Clean The Storage<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The EX4300 has a limited storage capacity, so first we shall purge it&#8217;s temp files<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run &#8220;<kbd><code><em>request system storage cleanup dry-run<\/em><\/code><\/kbd>&#8221; in the cli.<\/li>\n\n\n\n<li>Once you&#8217;re sure it&#8217;s working, run it again without &#8220;<em>dry-run<\/em>&#8220;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Results should look a little like:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@stack01&gt; request system storage cleanup\nPlease check the list of files to be deleted using the dry-run option. i.e.\nrequest system storage cleanup dry-run\nDo you want to proceed ? &#91;yes,no] (no) yes\n--- JUNOS 21.4R3.15 built 2022-09-03 07:20:43 UTC\nfpc0:\n--------------------------------------------------------------------------\n\nList of files to delete:\n\n\t Size Date\t   Name\n   107B Oct 23 11:50 \/var\/crash\/bcast.disp.log\n  2804B Oct 23 12:51 \/var\/crash\/juniper.conf.sync.gz\n    57B Oct 23 11:48 \/var\/crash\/krt_rpf_filter.txt\n   111B Oct 23 11:48 \/var\/crash\/pfe_debug_commands\n     0B Oct 23 13:00 \/var\/crash\/rtsdb\/if-rtsdb\n     0B Oct 23 12:58 \/var\/crash\/stable\n    11B Oct 23 13:01 \/var\/jail\/tmp\/alarmd.ts\n  33.4K Oct 23 12:58 \/var\/log\/dcd.0.gz\n   139B Oct 23 17:00 \/var\/log\/default-log-messages.0.gz\n 742.5K Oct 23 12:15 \/var\/log\/dhcp_logfile.0.gz\n  5977B Oct 23 17:00 \/var\/log\/interactive-commands.0.gz\n  8309B Oct 23 17:00 \/var\/log\/messages.0.gz\n  23.6K Oct 23 12:45 \/var\/log\/messages.1.gz\n  21.6K Oct 23 12:00 \/var\/log\/messages.2.gz\n   150B Oct 23 12:58 \/var\/log\/wtmp.0.gz\n    27B Oct 23 11:41 \/var\/log\/wtmp.1.gz\n    45B Oct 23 11:48 \/var\/preserve\/jdhcp_client_data\n    45B Oct 23 11:48 \/var\/preserve\/jdhcp_client_data_bkp\n   107B Oct 23 11:50 \/var\/tmp\/bcast.disp.log\n  2804B Oct 23 12:51 \/var\/tmp\/juniper.conf.sync.gz\n    57B Oct 23 11:48 \/var\/tmp\/krt_rpf_filter.txt\n   111B Oct 23 11:48 \/var\/tmp\/pfe_debug_commands\n     0B Oct 23 13:00 \/var\/tmp\/rtsdb\/if-rtsdb\n     0B Oct 23 12:58 \/var\/tmp\/stable\n\nfpc1:\n--------------------------------------------------------------------------\n\nList of files to delete:\n\n\t Size Date\t   Name\n   140B Oct 23 17:00 \/var\/log\/default-log-messages.0.gz\n  4003B Oct 23 17:00 \/var\/log\/interactive-commands.0.gz\n  3697B Oct 23 17:00 \/var\/log\/messages.0.gz\n  7194B Oct 23 13:00 \/var\/log\/messages.1.gz\n  6966B Oct 23 12:30 \/var\/log\/messages.2.gz\n  6397B Oct 23 12:00 \/var\/log\/messages.3.gz\n   132B Oct 23 17:00 \/var\/log\/smartd.trace.0.gz\n    88B Oct 23 12:59 \/var\/log\/wtmp.0.gz\n    27B Oct 23 11:41 \/var\/log\/wtmp.1.gz\n  2804B Oct 23 12:51 \/var\/tmp\/juniper.conf.sync.gz\n   111B Oct 23 12:59 \/var\/tmp\/pfe_debug_commands\n\nfpc2:\n--------------------------------------------------------------------------\n\nList of files to delete:\n\n\t Size Date\t   Name\n   107B Oct 23 13:01 \/var\/crash\/bcast.disp.log\n  2804B Oct 23 10:19 \/var\/crash\/juniper.conf.sync.gz\n    57B Oct 23 13:00 \/var\/crash\/krt_rpf_filter.txt\n   111B Oct 23 11:51 \/var\/crash\/pfe_debug_commands\n     0B Oct 23 13:00 \/var\/crash\/rtsdb\/if-rtsdb\n     0B Oct 23 12:58 \/var\/crash\/stable\n    11B Oct 23 13:06 \/var\/jail\/tmp\/alarmd.ts\n 221.0K Oct 23 13:33 \/var\/log\/chassisd.0.gz\n   138B Oct 23 17:00 \/var\/log\/default-log-messages.0.gz\n 550.0K Oct 23 15:24 \/var\/log\/dhcp_logfile.0.gz\n 702.7K Oct 23 13:33 \/var\/log\/dhcp_logfile.1.gz\n  7594B Oct 23 17:00 \/var\/log\/interactive-commands.0.gz\n  7359B Oct 23 17:00 \/var\/log\/messages.0.gz\n  13.6K Oct 23 16:45 \/var\/log\/messages.1.gz\n  13.7K Oct 23 16:15 \/var\/log\/messages.2.gz\n  13.6K Oct 23 15:45 \/var\/log\/messages.3.gz\n  13.7K Oct 23 15:15 \/var\/log\/messages.4.gz\n  13.9K Oct 23 14:45 \/var\/log\/messages.5.gz\n  13.8K Oct 23 14:15 \/var\/log\/messages.6.gz\n  15.8K Oct 23 13:45 \/var\/log\/messages.7.gz\n  21.5K Oct 23 13:15 \/var\/log\/messages.8.gz\n  19.9K Oct 23 13:00 \/var\/log\/messages.9.gz\n   152B Oct 23 17:00 \/var\/log\/wtmp.0.gz\n    27B Oct 23 11:41 \/var\/log\/wtmp.1.gz\n    45B Oct 23 13:00 \/var\/preserve\/jdhcp_client_data\n    45B Oct 23 12:25 \/var\/preserve\/jdhcp_client_data_bkp\n   107B Oct 23 13:01 \/var\/tmp\/bcast.disp.log\n  2804B Oct 23 10:19 \/var\/tmp\/juniper.conf.sync.gz\n    57B Oct 23 13:00 \/var\/tmp\/krt_rpf_filter.txt\n   111B Oct 23 11:51 \/var\/tmp\/pfe_debug_commands\n     0B Oct 23 13:00 \/var\/tmp\/rtsdb\/if-rtsdb\n     0B Oct 23 12:58 \/var\/tmp\/stable\n\nfpc3:\n--------------------------------------------------------------------------\n\nList of files to delete:\n\n\t Size Date\t   Name\n   138B Oct 23 17:00 \/var\/log\/default-log-messages.0.gz\n  5946B Oct 23 17:00 \/var\/log\/interactive-commands.0.gz\n   266B Oct 23 17:00 \/var\/log\/messages.0.gz\n  6459B Oct 23 17:00 \/var\/log\/messages.1.gz\n  6516B Oct 23 16:15 \/var\/log\/messages.2.gz\n  6510B Oct 23 15:30 \/var\/log\/messages.3.gz\n  6452B Oct 23 14:45 \/var\/log\/messages.4.gz\n  5845B Oct 23 14:00 \/var\/log\/messages.5.gz\n  9262B Oct 23 13:30 \/var\/log\/messages.6.gz\n  12.1K Oct 23 13:00 \/var\/log\/messages.7.gz\n  13.9K Oct 23 12:45 \/var\/log\/messages.8.gz\n  12.8K Oct 23 12:30 \/var\/log\/messages.9.gz\n   130B Oct 23 17:00 \/var\/log\/smartd.trace.0.gz\n   194B Oct 23 12:59 \/var\/log\/wtmp.0.gz\n    27B Oct 23 11:41 \/var\/log\/wtmp.1.gz\n  2804B Oct 23 12:51 \/var\/tmp\/juniper.conf.sync.gz\n   111B Oct 23 12:13 \/var\/tmp\/pfe_debug_commands\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Next steps are to exit to shell, mount the USB with your install on it, and copy files to the MASTER!!! If you aren&#8217;t sure, check serial numbers against the <em>show virtual-chassis status<\/em> <em> <\/em>command.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nroot@stack01&gt; show virtual-chassis status\n\nPreprovisioned Virtual Chassis\nVirtual Chassis ID: 614c.c105.18b9\nVirtual Chassis Mode: Mixed\n                                                Mstr           Mixed Route Neighbor List\nMember ID  Status   Serial No    Model          prio  Role      Mode  Mode ID  Interface\n0 (FPC 0)  Prsnt    TC111111024 ex4600-40f     129   Backup       Y  VC   2  vcp-255\/0\/24\n                                                                           1  vcp-255\/0\/26\n                                                                           3  vcp-255\/0\/23\n1 (FPC 1)  Prsnt    PD1111110770 ex4300-48p       0   Linecard     Y  VC   0  vcp-255\/1\/0\n                                                                           2  vcp-255\/1\/1\n2 (FPC 2)  Prsnt    TC1111110326 ex4600-40f     129   Master*      Y  VC   0  vcp-255\/0\/24\n                                                                           1  vcp-255\/0\/27\n3 (FPC 3)  Prsnt    PD1111110947 ex4300-48p       0   Linecard     Y  VC   0  vcp-255\/2\/0\n\n\n\n{master:2}\nroot@stack01:RE:2%\tumass0: at uhub2 port 2 (addr 3) disconnected\n(da0:umass-sim0:0:0:0): lost device\n(da0:umass-sim0:0:0:0): removing device entry\numass0: detached\numass0: vendor 0xfafa product 0xfafa, rev 2.00\/1.07, addr 3\nda0 at umass-sim0 bus 0 target 0 lun 0\nda0: &lt;  8.07&gt; Removable Direct Access SCSI-4 device\nda0: 40.000MB\/s transfers\nda0: 61035MB (124999680 512 byte sectors: 255H 63S\/T 7780C)\n\nroot@stack01:RE:2%\tmount_msdosfs \/dev\/da0s1 \/mnt\nroot@stack01:RE:2%\tcp \/mnt\/jinstall-* \/var\/tmp\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Now to actually install the code&#8230; Use the following command <em>request system software add set [\/var\/tmp\/&lt;filename1&gt; \/var\/tmp\/&lt;filename2&gt;]<\/em><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>use the no-verification directive in the above command to avoid annoying config checks.  Only do this if you have issues.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>root@stack01:RE:2%\tcli\n{master:2}\nroot@stack01&gt;request system software add set &#91;\/var\/tmp\/jinstall-host-ex-4600-21.4R3-S11.3-signed.tgz \/var\/tmp\/jinstall-ex-4300-21.4R3-S11.3-signed.tgz]\n&#91;Oct 23 17:22:37]: Retrieving software images. This process can take several minutes. Please be patient..\n\nRetrieving version and model information from \/var\/tmp\/jinstall-host-ex-4600-21.4R3-S11.3-signed.tgz\n\nRetrieving version and model information from \/var\/tmp\/jinstall-ex-4300-21.4R3-S11.3-signed.tgz\n\nChecking pending install on fpc1\n\nChecking pending install on fpc3\nPushing bundle \/var\/tmp\/jinstall-ex-4300-21.4R3-S11.3-signed.tgz to fpc1\nPushing bundle \/var\/tmp\/jinstall-ex-4300-21.4R3-S11.3-signed.tgz to fpc3\n\nfpc1:\nVerify the signature of the new package\nVerified jinstall-ex-4300-21.4R3-S11.3.tgz signed by PackageProductionECP256_2025 method ECDSA256+SHA256\nWARNING: A reboot is required to install the software\nWARNING:     Use the 'request system reboot' command immediately\n\nfpc3:\nVerify the signature of the new package\nVerified jinstall-ex-4300-21.4R3-S11.3.tgz signed by PackageProductionECP256_2025 method ECDSA256+SHA256\nWARNING: A reboot is required to install the software\nWARNING:     Use the 'request system reboot' command immediately\n\nChecking pending install on fpc0\n\nChecking pending install on fpc2\nPushing bundle \/var\/tmp\/jinstall-host-ex-4600-21.4R3-S11.3-signed.tgz to fpc0\n\nfpc0:\nVerified jinstall-vjunos-21.4R3-S11.3.tgz signed by PackageProductionSHA1RSA_2025 method RSA2048+SHA1\nAdding vjunos...\nSaving contents of boot area prior to installation\n\nWARNING:     This package will load JUNOS 21.4R3-S11.3 software.\nWARNING:     It will save JUNOS configuration files, and SSH keys\nWARNING:     (if configured), but erase all other files and information\nWARNING:     stored on this machine.  It will attempt to preserve dumps\nWARNING:     and log files, but this can not be guaranteed.  This is the\nWARNING:     pre-installation stage and all the software is loaded when\nWARNING:     you reboot the system.\n\nPOST-INSTALL...\nSaving the config files ...\nNOTICE: uncommitted changes have been saved in \/var\/db\/config\/juniper.conf.pre-install\nPushing installation package to host...\nExtracting jinstall-ex-4600-21.4R3-S11.3 ...\nInstall jinstall-ex-4600-21.4R3-S11.3 completed\nInstall jinstall-vjunos completed\n\nWARNING:     A REBOOT IS REQUIRED TO LOAD THIS SOFTWARE CORRECTLY. Use the\nWARNING:     'request system reboot' command when software installation is\nWARNING:     complete. To abort the installation, do not reboot your system,\nWARNING:     instead use the 'request system software delete jinstall'\nWARNING:     command as soon as this operation completes.\n\nSaving state for rollback ...\n\nfpc2:\nVerified jinstall-vjunos-21.4R3-S11.3.tgz signed by PackageProductionSHA1RSA_2025 method RSA2048+SHA1\nAdding vjunos...\nSaving contents of boot area prior to installation\n\nWARNING:     This package will load JUNOS 21.4R3-S11.3 software.\nWARNING:     It will save JUNOS configuration files, and SSH keys\nWARNING:     (if configured), but erase all other files and information\nWARNING:     stored on this machine.  It will attempt to preserve dumps\nWARNING:     and log files, but this can not be guaranteed.  This is the\nWARNING:     pre-installation stage and all the software is loaded when\nWARNING:     you reboot the system.\n\nPOST-INSTALL...\nSaving the config files ...\nNOTICE: uncommitted changes have been saved in \/var\/db\/config\/juniper.conf.pre-install\nPushing installation package to host...\nExtracting jinstall-ex-4600-21.4R3-S11.3 ...\nInstall jinstall-ex-4600-21.4R3-S11.3 completed\nInstall jinstall-vjunos completed\n\nWARNING:     A REBOOT IS REQUIRED TO LOAD THIS SOFTWARE CORRECTLY. Use the\nWARNING:     'request system reboot' command when software installation is\nWARNING:     complete. To abort the installation, do not reboot your system,\nWARNING:     instead use the 'request system software delete jinstall'\nWARNING:     command as soon as this operation completes.\n\nSaving state for rollback ...\n\n{master:2}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Almost done.  Now Reboot all the member switches once the installation is complete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>root&gt; request system reboot all-members<br>Reboot the system ? [yes,no] (no) yes<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And finally Verify the version once the switches come up after reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>{master:0}<br>root&gt; show version<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial is a reminder how to do something I perform once a year. Requirements: Steps: First off, take a config backup! Read this Juniper support document. Clean The Storage The EX4300 has a limited storage capacity, so first we shall purge it&#8217;s temp files Results should look a little like: Next steps are to &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.demaria.net\/?p=49\" class=\"more-link\">Read more<span class=\"screen-reader-text\"> &#8220;How-To: Upgrade JunOS in a Mixed EX4300\/4600 Stack&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[5],"class_list":["post-49","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-tech"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/posts\/49","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.demaria.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=49"}],"version-history":[{"count":11,"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/posts\/49\/revisions"}],"predecessor-version":[{"id":81,"href":"https:\/\/www.demaria.net\/index.php?rest_route=\/wp\/v2\/posts\/49\/revisions\/81"}],"wp:attachment":[{"href":"https:\/\/www.demaria.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=49"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.demaria.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=49"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.demaria.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}