Din câte știu, nu există nicio funcție care să permită comutarea a două tabele de rutare în Linux și nici să înlocuiască atomic o regulă de rutare existentă. Este încă posibil să se realizeze un comutator atomic ca cel prezentat mai jos. Toată gimnastica cu reguli intermediare este să fii cu adevărat atomic la orice pas, fără nicio avertizare. Pentru toate intențiile și scopurile, mergi la
regulile de mai jos sunt opționale, iar cvasi-atomicitatea ar fi încă obținută fără ele.
Algoritm:
starea anterioară:
Tabela de rutare 1000 a fost deja adăugată, precum și o regulă cu preferința 20000 care face o căutare pe acest tabel (nici un selector aici, deoarece această informație nu era disponibilă de la OP):
$ ip -4 regula
0: din toate căutările locale
20000: din toate căutările 1000
32766: din toate căutările principale
32767: din toate căutările implicite
pregatire:
Tabelul de rutare 1001 este pregătit în avans cu câteva ip route add... tabelul 1001
comenzi. Deoarece nicio regulă nu face referire la el, este încă inactiv. Acesta este tabelul de rutare care va înlocui tabelul de rutare 1000.
adăugați noua regulă de rutare (care ar putea avea selectori suplimentari) făcând referire la o valoare de preferință ulterioară, dar omiteți-o mai întâi cu un mergi la regulă
... arătând spre regula obișnuită care caută în sus principal, deci nu există nici măcar un caz în care tabelul vechi de rutare ar afecta unele pachete, iar cazul de rutare mai nou ar afecta simultan alte pachete înainte ca comutarea să se încheie. Acest lucru ar trebui să nu conteze cu adevărat și mergi la
regulile de mai jos ar putea fi omise dacă nu este necesară o asemenea atomicitate strictă.
regulă ip add pref 20001 du-te la 32766
regulă ip add pref 20002 căutare 1001
comutați atomic la tabelul de rutare mai nou cu un alte mergi la regulă cu o preferință anterioară care va sări peste atât regula pentru tabelul de rutare mai vechi, cât și regula care a sărit peste tabelul de rutare mai nou.
regulă ip add pref 19999 dus la 20002
curăță
regulă ip del pref 20000
ip regula del pref 20001
ip rule del pref 19999
reveniți la starea anterioară: reutilizați ID-ul tabelului de rutare anterior și valorile preferințelor regulii de rutare
refaceți pe tabelul de rutare 1000 aceleași operațiuni efectuate anterior pe tabelul de rutare 1001 la pasul 2., începând prin a-l spăla
IP route flush table 1000
ip route add... tabelul 1000
...
resetați preferința și referința la starea anterioară și curățați
regulă ip add pref 20000 căutare 1000
ip rule del pref 20002
IP route flush table 1001
Sau schimbarea rolurilor tabelelor 1000 și 1001 în următoarea iterație ar evita probabil nevoia de a popula rutele de două ori.
Statul a revenit acum la pasul 1.
Dacă scopul este înlocuirea principal tabel de rutare, luați în considerare doar că este tabelul ID 254 (și că este singurul tabel (de-a lungul local tabel de rutare) pentru a primi rute automate ale nucleului: mai bine folosiți întotdeauna fărăprefixroute
la adrese și adăugarea rutelor de către demon în acest caz): nu prea multe de schimbat în algoritmul de mai sus, cu excepția posibilului înlocuire du-te la 32766
cu du-te la 32767
sau o schimbare similară. De asemenea, orice rută nouă adăugată într-un tabel de rutare (chiar dacă nu este referită) necesită validare cu ea însăși sau rutele deja prezente în acest tabel sau regulile active curente și rutele tabelelor de referință.