ААААРРРРГГГГХХХХ...
Понякога нещата, които най-трудно се забелязват, са тези, които са ти под носа (а моят е голям)! И за пореден път някакво щастие ми се усмихва баш на петък 13-ти (макар че сядам да го опиша след полунощ).
Та... в SLES 12 демонът Wicked, който се грижи за мрежата, е вкоренен дълбоко в системата, дори всички мрежови команди, имената на които започват с "if", са заменени с негови инструменти, и всички мрежови операции минават през него. Но не и командата "ip", наличието на която в системата някак пропуснах преди. Изпълнението на
ip addr add 1.2.3.4 dev eth0
успешно задава адрес на интерфейса, независимо дали има връзка, или не, и независимо дали Wicked е включен, или не. И така това се явява решението на задачата.
Сега, има обаче малко допълнения (все пак още си е SuSE - не може без извращения). Това, че може да зададе адрес на интерфейса, не е достатъчно. Ако Wicked не е включен и не е взел в ръцете си мрежовите интерфейси, командата "ip" само задава адрес, но интерфейсът няма свързаност дори и при включен кабел, командата "ip" не може да зададе маршрутизатор, командата ifenslave не може да зададе bonding (макар че това не на всеки му трябва), и услуги, зависещи от работеща мрежа при стартирането си (като dhcpd), не палят. Така че е нужно Wicked да се остави включен и интерфейсите (включително и bonding-ите, че иначе няма да се виждат в ifconfig) да се настроят през него, а командата "ip" да се ползва само за задаване на адреси и маршрутизатори, когато не са зададени от Wicked. Тук има малко свобода на избора. Ако в Wicked се зададат статични и/или DHCP адреси, то командата "ip" трябва да се изпълнява само при зареждане на системата и за предпочитане е само тогава, когато при това няма връзка и Wicked не е задал адреси. Ако в Wicked на интерфейсите се зададе да няма настройка за адресите (опцията "No Link and IP Setup"), то всяко задаване и промяна на адресите ще се прави с командата "ip", като не трябва да се рестартира мрежата със systemctl (или service) скрипта и ifdown/ifup командите, защото интерфейсите ще останат без адреси, докато пак не се изпълни "ip" командата с нужните настройки. За споменатия по-нагоре демон Wicked-nanny, който се грижи да зададе адрес, когато се вкара кабел, забравяме - в никой от сегашните варианти не е нужен, а дори в някои случаи може да зададе излишен допълнителен (втори, трети...) адрес на някой интерфейс. Трябва да се има предвид и, че ако изпълнението на "ip" командата се сложи в /etc/init.d/boot.local, за да се изпълнява при зареждане на системата, то преди командата трябва да се добави ред със sleep от някакви секунди, иначе, заради асинхронността на systemd, командата ще се изпълни, преди Wicked да е вдигнал съответния интерфейс и адресът няма да се зададе. Вместо това командата "ip" може да се добави в /etc/wicked/extensions/firewall (скрипт на Wicked, който рестартира защитната стена при рестарт на мрежата; може и в отделен скрипт, но трябва да се опише после в XML-ите на Wicked), с което не само ще се спести нуждата от sleep преди "ip" командата, но и ще се задават нужните настройки при рестарт на мрежата със systemctl, service или if-down-ifup, когато на Wicked е казано да не задава адреси. Ако обаче се планират такива рестарти на мрежата, а човек има dhcpd на системата, то в допълнение ще трябва да направи всички гимнастики, които описах в началото на темата (с изключение на Wicked-nanny), за да го запази работоспособен след това. Подобни неща ще са нужни и за други услуги, които, подобно на dhcpd, много зависят от това какво се случва с интерфейсите, с които работят.
Извинявам се за поредното обширно обяснение, но някой ден на някого (включително и на мен, като го позабравя) може да му спести доста глупави главоболия