LinuxQuestions.org
Welcome to the most active Linux Forum on the web.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Distributions > Slackware
User Name
Password
Slackware This Forum is for the discussion of Slackware Linux.

Notices


Reply
  Search this Thread
Old 11-25-2013, 07:57 AM   #1
slackcode
LQ Newbie
 
Registered: Sep 2007
Location: China
Distribution: slackware
Posts: 25

Rep: Reputation: 0
Why MAXNICS=${MAXNICS:-6} in rc.inet1.conf?


Code:
############################
# DETERMINE INTERFACE LIST #
############################

# Compose a list of interfaces from /etc/rc.d/rc.inet1.conf (with a maximum
# of 6 interfaces, but you can easily enlarge the interface limit
# - send me a picture of such a box :-).
# If a value for IFNAME[n] is not set, we assume it is an eth'n' interface.
# This way, the new script is compatible with older rc.inet1.conf files.
# The IFNAME array will be used to determine which interfaces to bring up/down.
MAXNICS=${MAXNICS:-6}
i=0
while [ $i -lt $MAXNICS ];
do
  IFNAME[$i]=${IFNAME[$i]:=eth${i}}
  i=$(($i+1))
done
if [ "$DEBUG_ETH_UP" = "yes" ]; then
  echo "/etc/rc.d/rc.inet1:  List of interfaces: '${IFNAME[@]}'" | $LOGGER
fi
I have a situation that need more than 6 (Maybe 7).
I set an ip address and it can't be valid until I ifconfig that.

Finally, I found this code in rc.inet1.
I want to know why the number is 6? Is it about the performance or any other reason?
Thx.
 
Old 11-25-2013, 08:14 AM   #2
guanx
Senior Member
 
Registered: Dec 2008
Posts: 1,176

Rep: Reputation: 233Reputation: 233Reputation: 233
Pre-vacuum-tube computers take a lot of time to loop through large number of empty setups. This is the evidence of slackware being the oldest surviving Linux distribution.
 
Old 11-25-2013, 08:22 AM   #3
slackcode
LQ Newbie
 
Registered: Sep 2007
Location: China
Distribution: slackware
Posts: 25

Original Poster
Rep: Reputation: 0
Quote:
Originally Posted by guanx View Post
Pre-vacuum-tube computers take a lot of time to loop through large number of empty setups. This is the evidence of slackware being the oldest surviving Linux distribution.
Yes, I agree. Maybe I can cut some IPs : )
 
Old 11-25-2013, 08:29 AM   #4
Didier Spaier
LQ Addict
 
Registered: Nov 2008
Location: Paris, France
Distribution: Slint64-15.0
Posts: 11,057

Rep: Reputation: Disabled
However high the limit, someone will find it too low.

Last edited by Didier Spaier; 11-25-2013 at 08:39 AM. Reason: Nota accurate sentence removed
 
2 members found this post helpful.
Old 11-25-2013, 09:17 AM   #5
GazL
LQ Veteran
 
Registered: May 2008
Posts: 6,897

Rep: Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019
... which is reason to avoid having a arbitrary limit.

A long while ago I wrote myself an rc.inet1 replacement modeled on the OpenBSD approach.

It cycles through the interfaces listed on it's args, or if none, the interfaces it finds in /proc/net/dev and if it finds a corresponding /etc/hostname.<interface> file uses that to configure the interface. I find this much easier to work with than the stock rc.inet1 + rc.inet1.conf approach, which has always seemed a little unwieldy to me.

The config files looks like this:
Code:
root@ws1:~# cat /etc/hostname.eth0 
inet 192.168.0.2
!route add default gw 192.168.0.1
root@ws1:~#
As you can see, it also allows static routes to be kept with the associated interface config, which keeps things nice and tidy. To use dhclient, the file simply needs contain the word 'dhcp'. I've not fleshed it out to support wifi yet, but a "!wpa_supplicant blah blah...." line before a "dhcp" line ought to do the job.
 
Old 11-25-2013, 09:46 AM   #6
slackcode
LQ Newbie
 
Registered: Sep 2007
Location: China
Distribution: slackware
Posts: 25

Original Poster
Rep: Reputation: 0
Quote:
Originally Posted by GazL View Post
... which is reason to avoid having a arbitrary limit.

It cycles through the interfaces listed on it's args, or if none, the interfaces it finds in /proc/net/dev and if it finds a corresponding /etc/hostname.<interface> file uses that to configure the interface. I find this much easier to work with than the stock rc.inet1 + rc.inet1.conf approach, which has always seemed a little unwieldy to me.

As you can see, it also allows static routes to be kept with the associated interface config, which keeps things nice and tidy. To use dhclient, the file simply needs contain the word 'dhcp'. I've not fleshed it out to support wifi yet, but a "!wpa_supplicant blah blah...." line before a "dhcp" line ought to do the job.
Normally, I think it is simple if I configure all interfaces in one file. If move the interfaces to multiple files, I need to configure them in multiple place.
I think rc.inet1.conf can be scanned to summate amout of the interfaces, but it seems ugly and not KISS.
 
Old 11-25-2013, 11:33 AM   #7
gnashley
Amigo developer
 
Registered: Dec 2003
Location: Germany
Distribution: Slackware
Posts: 4,928

Rep: Reputation: 612Reputation: 612Reputation: 612Reputation: 612Reputation: 612Reputation: 612
GazL, can you post your replacement for rc.inet1?
 
Old 11-25-2013, 12:34 PM   #8
GazL
LQ Veteran
 
Registered: May 2008
Posts: 6,897

Rep: Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019Reputation: 5019
I can remember we've talked about this sort of thing in the past, so I suspect you may have already seen it, but I'll attach it here anyway. It's not particularly sophisticated, but that's why I like it


BTW, if anyone tries it out, don't forget to create a /etc/hostname.lo containing "inet 127.0.0.1"

Last edited by GazL; 05-23-2014 at 11:51 AM.
 
Old 11-26-2013, 03:10 PM   #9
wildwizard
Member
 
Registered: Apr 2009
Location: Oz
Distribution: slackware64-14.0
Posts: 875

Rep: Reputation: 282Reputation: 282Reputation: 282
Quote:
Originally Posted by slackcode View Post
Yes, I agree. Maybe I can cut some IPs : )
If the problem originates from having extra IP's and not actual interfaces then I think I can help.

I have below rc.inet1 and rc.inet1.conf that I use, the IP addresses used are in CIDR notation and the setup no longer uses net masks (ignore the ones in the conf they are not used.)

To add extra IP's on an interface you simply separate them with spaces so you could have the following :-

Code:
IPADDR[0]="192.168.10.10/24 192.168.10.11/24 192.168.10.12/24 192.168.10.13/24 10.0.0.1/24"
and the first interface would have 5 IP's.

http://wildwizard.abnormalpenguin.co...lackware/rc.d/
 
Old 11-29-2013, 07:52 AM   #10
WiseDraco
Member
 
Registered: Nov 2006
Location: Europe,Latvia,Riga
Distribution: slackware,slax, OS X, exMandriva
Posts: 591

Rep: Reputation: 73
Quote:
Originally Posted by guanx View Post
Pre-vacuum-tube computers take a lot of time to loop through large number of empty setups. This is the evidence of slackware being the oldest surviving Linux distribution.
if i remember correctly, about a years 2003 - 2005 i have linux slackware ( 10.0 or so on version) based firewall \ router with 7 NIC. i do not change anything in rc.inetd1 - maybe then there are not that string?
 
Old 03-26-2022, 08:11 PM   #11
eduardr
Member
 
Registered: Sep 2011
Distribution: Slackware64 14.2+ (-current)
Posts: 106

Rep: Reputation: Disabled
Suggest to increase to 10 at least, in the default config

It took me almost an hour to again figure out the solution to this problem (previously I knew about this but forgot years ago).

Had to uncomment and set MAXNICS="8" in /etc/rc.d/rc.inet1.conf

There are many servers out there which come standard with more than 6 built-in ports. Even my little server (https://www.supermicro.com/en/produc...YS-E300-8D.cfm) has 8 built-in network interfaces.

Ideal solution would be for rc.inet1 to deal with any # of interfaces, without having to hardcode a specific #.

Failing that, would suggest Slackware to default to 10 interfaces, instead of 6 - that would cover many more servers by default, without "new players" (and old players) falling into this very difficult-to-debug trap. Really got lucky here that I was able to drag out this knowledge from my head that I forgot so long ago.
 
Old 03-26-2022, 11:23 PM   #12
tadgy
Member
 
Registered: May 2018
Location: UK
Distribution: Slackware (servers), Void (desktop/laptop)
Posts: 299

Rep: Reputation: 401Reputation: 401Reputation: 401Reputation: 401Reputation: 401
This question has come up before.

The problem with trying to handle any number of interfaces is that bash does not have an expansion for providing the highest indices of an array.

You can easily determine the number of elements of an array in bash (${#ARRAY[*]}), but lets say you define your interfaces as follows:
Code:
IFNAME[0]="eth0"
IPADDRS[0]="192.168.1.1"
IFNAME[1024]="eth1"
IPADDRS[1024]="10.0.0.1"
(note the array indices numbers)
which is perfectly legal syntax in both bash and the rc.inet1.conf file.

In order to make sure both the interfaces get assigned, you need to know the highest indices in order to know when to stop processing. You can't just look for an empty definition for IPADDRS and stop there as there are 'holes' in the array where that indices is not defined. You also cannot loop forever just in case someone defined a stupidly high number. And every iteration of the loop costs real time, which undoubtedly slows down rc.inet1 to a point where people would complain that their system takes longer to boot.

So, we need somewhere to stop the loop. Historically this was after 6 iterations. When I re-wrote rc.inet1 for 15.0, I kept that "tradition", as is the Slackware way. I also kept in Pat's original comment regarding sending him a picture for the same reason

I agree that a lot of systems these days are going to have more than 6 interfaces (or more than 6 interface definitions, as virtual interfaces and bonds also count in rc.inet1.conf) and MAXNICS could realistically be set higher these days - Pat may even accept a patch to raise it if you submit one.

I kept the tradition of 6. It's really as simple as that. But, setting it too high is going to slow down processing of rc.inet1 during boot. Also, where do you set the value? Everyone and their dog is going to have an opinion on what the value should be - and have arguments as to why it should be that high because their server has X interfaces, when yours only has X-1.

So, that's it really. That's the rationale as to why I kept it at 6 - but try your luck with a patch to Pat...

Sorry for the long post, but I thought it worthwhile to put this issue to bed once and for all
 
5 members found this post helpful.
Old 03-27-2022, 09:38 AM   #13
allend
LQ 5k Club
 
Registered: Oct 2003
Location: Melbourne
Distribution: Slackware64-15.0
Posts: 6,371

Rep: Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749Reputation: 2749
Quote:
bash does not have an expansion for providing the highest indices of an array
You can use the ${!IFNAME[@]} construction to get a list of the indices and assign that to an array.
My suggestion for this.
Code:
# diff -u3 a/rc.inet1 b/rc.inet1 
--- a/rc.inet1  2022-03-28 01:10:55.693900246 +1100
+++ b/rc.inet1  2022-03-28 01:31:22.430882036 +1100
@@ -49,11 +49,13 @@
 # If a value for IFNAME[n] is not set, we assume it is an eth'n' interface.
 # This way, the new script is compatible with older rc.inet1.conf files.
 # The IFNAME array will be used to determine which interfaces to bring up/down.
-MAXNICS=${MAXNICS:-6}
+MAXNICS=${#IFNAME[@]}
+NICINDEX=( ${!IFNAME[@]} )
 i=0
 while [ $i -lt $MAXNICS ];
 do
-  IFNAME[$i]=${IFNAME[$i]:=eth${i}}
+  j=${NICINDEX[$i]}
+  IFNAME[$j]=${IFNAME[$j]:=eth${j}}
   i=$((i+1))
 done
 debug_log "List of interfaces: ${IFNAME[*]}"
@@ -245,7 +247,7 @@
   # Determine position 'i' of this interface in the IFNAME array:
   i=0
   while [ $i -lt $MAXNICS ]; do
-    [ "${IFNAME[$i]}" = "${1}" ] && break
+    [ "${IFNAME[${NICINDEX[$i]}]}" = "${1}" ] && break
     i=$((i+1))
   done
   # If "i" is greater or equal to "MAXNICS" at this point, it means we didn't
@@ -539,7 +541,7 @@
   # Determine position 'i' of this interface in the IFNAME array:
   i=0
   while [ $i -lt $MAXNICS ]; do
-    [ "${IFNAME[$i]}" = "${1}" ] && break
+    [ "${IFNAME[${NICINDEX[$i]}]}" = "${1}" ] && break
     i=$((i+1))
   done
   if [ $i -ge $MAXNICS ]; then
 
3 members found this post helpful.
Old 03-27-2022, 12:29 PM   #14
tadgy
Member
 
Registered: May 2018
Location: UK
Distribution: Slackware (servers), Void (desktop/laptop)
Posts: 299

Rep: Reputation: 401Reputation: 401Reputation: 401Reputation: 401Reputation: 401
Nice, that'll work

I'll create a full patch to do as you suggest and remove the MAXNICS setting from rc.inet1.conf. Hopefully Pat won't mind such a minor change.
 
1 members found this post helpful.
Old 03-27-2022, 01:34 PM   #15
Markus Wiesner
Member
 
Registered: Mar 2016
Distribution: Slackware
Posts: 146

Rep: Reputation: 237Reputation: 237Reputation: 237
Quote:
Originally Posted by allend View Post
You can use the ${!IFNAME[@]} construction to get a list of the indices and assign that to an array.
Currently IFNAME[X] is not empty but unset by default. So you could use that only after IFNAME[X] has been initialized to "ethX" (where required).

Quote:
Originally Posted by allend View Post
MAXNICS=${#IFNAME[@]}
This will unfortunately also fail when the array has gaps because "#" does not count unset indexes:

Code:
$ unset IFNAME
$ IFNAME[8]="foo"
$ echo "${IFNAME[@]@A}"
declare -a IFNAME=([8]="foo")
$ echo "${#IFNAME[@]}"
1
 
4 members found this post helpful.
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
Funky NIC configurations - MAXNICS setting in /etc/rc.d/rc.inet1too low. kfanyo Slackware 10 09-27-2008 10:51 PM
rc.wireless.conf and rc.inet1.conf for wireles cards davimint Slackware 1 07-13-2007 05:44 AM
where is rc.inet1.conf in debian? z3d0 Debian 3 09-23-2006 12:34 AM
rc.inet1 and rc.inet1.conf edafe Slackware 0 02-16-2005 09:51 AM
slack 9.1 rc.inet1.conf ? topche Slackware 4 12-28-2003 10:35 AM

LinuxQuestions.org > Forums > Linux Forums > Linux - Distributions > Slackware

All times are GMT -5. The time now is 06:43 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration